记录编号 78572 评测结果 AAAAAAAAAA
题目名称 zwei 最终得分 100
用户昵称 GravatarLauncher 是否通过 通过
代码语言 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;
}