题目链接: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;
}