1. 程式人生 > >luogu P5057 [CQOI2006]簡單題

luogu P5057 [CQOI2006]簡單題

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; }