您的位置:首页 > 其它

【线段树】COGS 1427. zwei

2013-10-27 00:05 246 查看
题目链接:http://cojs.tk/cogs/problem/problem.php?pid=1427

分析:
线段树样板题。

单点修改,区间求异或。

代码:

#include<cstdio>
#include<iostream>
#define lson l,m,rt << 1
#define rson m+1,r,rt <<1|1
using namespace std;
const int maxn = 100010;
int a[maxn<<2]={0},n,m,ll,rr;

void build(long long l,long long r,long long rt)
{
if (l==r)
{
scanf("%d",&a[rt]);
return;
}
long long m=(l+r)>>1;
build(lson);
build(rson);
a[rt]=(a[rt<<1]^a[rt<<1|1]);
}

void update(long long l,long long r,long long rt)
{
if (l==r)
{
a[rt]=rr;
return;
}
long long m=(l+r)>>1;
if (ll <= m) update(lson);
else update(rson);
a[rt]=(a[rt<<1]^a[rt<<1|1]);
}

long long query(long long l,long long r,long long rt)
{
if (ll <=l  && rr >= r) {return a[rt];}
long long m = (l + r) >> 1;
long long ret = 0;
if (ll<= m) ret ^= query(lson);
if (rr> m) ret ^= query(rson);
return ret;
}

int main()
{
freopen("zwei.in","r",stdin);
freopen("zwei.out","w",stdout);
cin>>n>>m;
build(1,n,1);
for (long long i=1;i<=m;i++)
{
int x;
cin>>x>>ll>>rr;
if (x==0)
update(1,n,1);
else
cout<<query(1,n,1)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oi 结构