记录编号 |
78572 |
评测结果 |
AAAAAAAAAA |
题目名称 |
zwei |
最终得分 |
100 |
用户昵称 |
Launcher |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.021 s |
提交时间 |
2013-11-04 10:09:13 |
内存使用 |
22.12 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ans;
long long a[100002]={0};
int f[1000002][3]={0};
int child[1000002][3]={0};
long long add[1000002]={0};
long long find(int t,int l,int r)
{
int x,y;
x=(f[t][1]+f[t][2])/2;
if ((l==f[t][1])&&(r==f[t][2]))
return add[t];
if ((l<=x)&&(r>x))
return find(child[t][1],l,x)^find(child[t][2],x+1,r);
if (r<=x)
return find(child[t][1],l,r);
if (l>x)
return find(child[t][2],l,r);
}
void replace(int t,int x)
{
if ((x==f[t][1])&&(x==f[t][2]))
{
add[t]=a[x];
}
else
if (x>(f[t][1]+f[t][2])/2)
{
replace(child[t][2],x);
add[t]=add[child[t][1]]^add[child[t][2]];
}
else
{
replace(child[t][1],x);
add[t]=add[child[t][1]]^add[child[t][2]];
}
}
long long build(int l,int r)
{
int x,y;
ans++;
x=ans;
y=(l+r)/2;
f[x][1]=l;
f[x][2]=r;
if (y>l)
child[x][1]=build(l,y);
if ((y==l)&&(l!=r))
child[x][1]=build(l,y);
if (y<r)
child[x][2]=build(y+1,r);
if ((y==l)&&(l==r))
add[x]=a[l];
if ((y>l)||(r-l==1)&&(y==l))
add[x]=add[child[x][1]]^add[child[x][2]];
return x;
}
void f0(int x,long long y)
{
a[x]=y;
replace(1,x);
}
void f1(int l,int r)
{
long long t;
t=find(1,l,r);
cout<<t<<endl;
}
int main()
{
freopen("zwei.in","r",stdin);
freopen("zwei.out","w",stdout);
int i,j,k,l;
long long x,y;
cin>>n>>m;
for (i=1;i<=n;i++)
cin>>a[i];
ans=0;
build(1,n);
for (i=1;i<=m;i++)
{
cin>>l>>x>>y;
if (l==0)
f0(x,y);
if (l==1)
f1(x,y);
}
return 0;
}