Information
- ID
- 119
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 9
- Tags
- # Submissions
- 10
- Accepted
- 4
- Uploaded By
难度: 黄
算法: 线段树,树状数组
首先,建一个线段树。维护区间加,以及查询单点。
对于修改操作,我们可以把对应的区间每个数 +1。
对于查询,我们查询该点的值,记为 u。u 就是其被翻转的次数。如为奇数,则结果为 1,否则为 0。
#include<bits/stdc++.h>
using namespace std;
struct tr{
int ls,rs,sum,tag;
};
struct sgt{
tr f[400010];
int cnt;
void push_up(int u){
f[u].sum=f[f[u].ls].sum+f[f[u].rs].sum;
}
void push_down(int u){
f[u].sum+=f[u].tag;
f[f[u].ls].tag+=f[u].tag;
f[f[u].rs].tag+=f[u].tag;
f[u].tag=0;
}
int build(int le,int ri){
int u=++cnt,mid=(le+ri)/2;
if(le<ri){
f[u].ls=build(le,mid);
f[u].rs=build(mid+1,ri);
}
return u;
}
void upd(int u,int le,int ri,int x,int y,int c){
push_down(u);
if(x<=le&&ri<=y){
f[u].tag+=c;
return ;
}
int mid=(le+ri)/2;
if(x<=mid) upd(f[u].ls,le,mid,x,y,c);
if(y>mid) upd(f[u].rs,mid+1,ri,x,y,c);
push_up(u);
}
int que(int u,int le,int ri,int x,int y){
push_down(u);
if(x<=le&&ri<=y){
return f[u].sum;
}
int mid=(le+ri)/2;
int res=0;
if(x<=mid) res+=que(f[u].ls,le,mid,x,y);
if(y>mid) res+=que(f[u].rs,mid+1,ri,x,y);
return res;
}
}t;
int n,q,op,a,b;
int main(){
scanf("%d%d",&n,&q);
t.build(1,n);
while(q--){
scanf("%d",&op);
if(op==1){
scanf("%d%d",&a,&b);
t.upd(1,1,n,a,b,1);
}
if(op==2){
scanf("%d",&a);
int w=t.que(1,1,n,a,a);
printf("%d\n",w%2);
}
}
}
By signing up a HFOJ universal account, you can submit code and join discussions in all online judging services provided by us.