COGS 1427. zwei
★☆ 输入文件:zwei.in
输出文件:zwei.out
简单对比
时间限制:1 s 内存限制:256 MB
【样例输入】
5 5 1 2 3 4 5 1 1 3 1 3 5 0 3 6 1 1 3 1 3 5
【样例输出】
0 2 5 7
【提示】
对于100%的数据 0 < n < 10^5, 0 < m < 10^5, 0 < ai,y < 10^9, 1 < x,l,r < n
对于40%的数据 0 < n < 1000,0 < m < 1000
线段树
单点修改,区间查询
#include <cstdio> #define Max 100000 struct node { int l,r,dis; }tr[Max*4+1]; int n,m; void up(int k) { tr[k].dis=tr[k<<1].dis^tr[k<<1|1].dis; } void build(int k,int l,int r) { tr[k].l=l;tr[k].r=r; if(l==r) { scanf("%d",&tr[k].dis); return; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); up(k); } void change(int k,int t,int v) { if(tr[k].l==tr[k].r) { tr[k].dis=v; return; } int mid=(tr[k].l+tr[k].r)>>1; if(mid>=t) change(k<<1,t,v); else change(k<<1|1,t,v); up(k); } int query(int k,int l,int r) { if(tr[k].l==l&&tr[k].r==r) { return tr[k].dis; } int mid=(tr[k].l+tr[k].r)>>1; if(l>mid) return query(k<<1|1,l,r); else if(r<=mid) return query(k<<1,l,r); else return query(k<<1,l,mid)^query(k<<1|1,mid+1,r); } int main() { freopen("zwei.in","r",stdin); freopen("zwei.out","w",stdout); scanf("%d%d",&n,&m); build(1,1,n); for(int x,y,z;m--;) { scanf("%d%d%d",&x,&y,&z); if(x==0) change(1,y,z); else printf("%d\n",query(1,y,z)); } return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。