记录编号 |
74915 |
评测结果 |
AAAAAAAAAA |
题目名称 |
zwei |
最终得分 |
100 |
用户昵称 |
digital-T |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.330 s |
提交时间 |
2013-10-26 18:14:47 |
内存使用 |
4.51 MiB |
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fi("zwei.in");
ofstream fo("zwei.out");
class Tree
{
public:
int l,r,Lchild,Rchild,S;
}tree[200010];
int n,m,tot,d[100001];
void maketree(int root,int l,int r)
{
tree[root].l=l;
tree[root].r=r;
if(l!=r)
{
int mid=(l+r)/2;
tree[root].Lchild=++tot;
maketree(tot,l,mid);
tree[root].Rchild=++tot;
maketree(tot,mid+1,r);
tree[root].S=tree[tree[root].Lchild].S^tree[tree[root].Rchild].S;
return;
}
tree[root].Lchild=tree[root].Rchild=-1;
tree[root].S=d[l];
}
void Changing(int root,int x,int y)
{
if(tree[root].l>x||tree[root].r<x)return;//不包含x的区间排除
if(tree[root].Lchild==-1)//找到了x
{
d[x]=y;
tree[root].S=y;
return;
}
Changing(tree[root].Lchild,x,y);
Changing(tree[root].Rchild,x,y);
tree[root].S=tree[tree[root].Lchild].S^tree[tree[root].Rchild].S;
}
int Printing(int root,int x,int y)//保证x,y在区间[l,r]中
{
if(tree[root].r<x||y<tree[root].l)return 0;//不包含x的区间排除
if(x<=tree[root].l&&tree[root].r<=y)return tree[root].S;//完全覆盖区间
return Printing(tree[root].Lchild,x,y)^Printing(tree[root].Rchild,x,y);
}
int main()
{
int i;
fi>>n>>m;
for(i=1;i<=n;i++)fi>>d[i];
tot=0;
maketree(0,1,n);
int cmp,x,y;
for(i=1;i<=m;i++)
{
fi>>cmp>>x>>y;
if(cmp==0)Changing(0,x,y);
else fo<<Printing(0,x,y)<<endl;
}
return 0;
}