您的位置:首页 > 运维架构

Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations(线段树)

2016-07-26 10:16 507 查看
题目地址:http://codeforces.com/problemset/problem/339/D

思路:线段树。PushUp时根据层数奇数偶数判断使用|还是^

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define maxn (1<<18)
int a[maxn];
int sum[maxn<<2];
void PushUp(int rt,int dep)
{
if(dep) sum[rt] = sum[rt<<1]|sum[rt<<1|1];
else sum[rt] = sum[rt<<1] ^ sum[rt<<1|1];
}
void build(int l,int r,int rt,int dep)
{
if(l==r)
{
sum[rt] = a[l];
return;
}
int mid = (l+r)>>1;
build(l,mid,rt<<1,dep^1);
build(mid+1,r,rt<<1|1,dep^1);
PushUp(rt,dep);
}
void update(int p,int l,int r,int rt,int v,int dep)
{
if(l==r)
{
sum[rt]=v;
return;
}
int mid = (l+r)>>1;
if(p<=mid) update(p,l,mid,rt<<1,v,dep^1);
else update(p,mid+1,r,rt<<1|1,v,dep^1);
PushUp(rt,dep);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int cnt= 1<<n;
for(int i=1;i<=cnt;i++)
scanf("%d",&a[i]);
build(1,cnt,1,n&1);
for(int i=1;i<=m;i++)
{
int p,v;
scanf("%d%d",&p,&v);
update(p,1,cnt,1,v,n&1);
printf("%d\n",sum[1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: