luogu P5057 [CQOI2006]簡單題
阿新 • • 發佈:2018-12-09
luogu P5057 [CQOI2006]簡單題
一個線段樹
提供一個新的思路:
對於操作一:給l,r之間所有數+1
對於操作二:看作詢問a[x]的奇偶性
奇數輸出1
偶數輸出0
就成一個模板題了
std:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define LB l,mid,num<<1
#define RB mid+1,r,num<<1|1
const int N=100005;
int n,m;
ll a[N];
ll t[4*N]={0};
ll laz[4 *N]={0};
void pushup(int num,int u)
{
if(laz[num]!=0)
{
laz[num<<1]+=laz[num];
laz[num<<1|1]+=laz[num];
t[num<<1|1]+=(ll)(u>>1)*laz[num];
t[num<<1]+=(ll)(u-(u>>1))*laz[num];
laz[num]=0;
}
}
void build(int l,int r,int num)
{
if(l==r)
{
t[num]=a[l];
return ;
}
int mid=(l+r)>>1;
build(LB);
build(RB);
t[num]=t[num<<1]+t[num<<1|1];
}
void update(int l,int r,int num,int L,int R,ll SUM)
{
if(L<=l&&R>=r)
{
laz[num]+=SUM;
t[num]+=SUM*(r-l+1);
return;
}
pushup(num,(r-l+1));
int mid=(l+r)>>1;
if(L<=mid) update(LB,L,R,SUM);
if(R>mid) update(RB,L,R,SUM);
t[num]=t[num<<1]+t[num<<1|1];
}
ll serch(int l,int r,int num,int L,int R)
{
if(L<=l&&R>=r)
{
return t[num];
}
pushup(num,(r-l+1));
int mid=(l+r)>>1;
ll rep=0;
if(L<=mid) rep+=serch(LB,L,R);
if(R>mid) rep+=serch(RB,L,R);
return rep;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
a[i]=0;
build(1,n,1);
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
if(x==1)
{
int l,r;
scanf("%d %d",&l,&r);
update(1,n,1,l,r,1);
}
else
{
int l;
scanf("%d",&l);
ll ans=serch(1,n,1,l,l);
if(ans%2==1) printf("1\n");
else printf("0\n");
}
}
return 0;
}