#include <cstdio>
#include <iostream>
#include <set>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
const int size=851111;
typedef long long ll;
typedef pair<int,int> pii;
int t,n,q,rr,tot;
int lh[size],lcnt[size],lf[size],lson[size],le[size],lz[size],ans[size],len[size];
int rh[size],rcnt[size],rf[size],rson[size],ri[size];
void init(int p,int l,int r,int h){
lson[p]=rson[p]=lz[p]=ans[p]=0;
lh[p]=rh[p]=h;
lf[p]=rf[p]=0;
lcnt[p]=rcnt[p]=len[p]=r-l+1;
le[p]=l;ri[p]=r;
}
void make(int &a,int l,int r,int h){
if(a==0){
a=++tot;if(tot>size-10)return ;
init(a,l,r,h);
}
}
void up(int p){
int lp=lson[p],rp=rson[p];
lcnt[p]=lcnt[lp];lf[p]=lf[lp];
rcnt[p]=rcnt[rp];rf[p]=rf[rp];
ans[p]=ans[lp]+ans[rp];
lh[p]=lh[lp];rh[p]=rh[rp];
if(lcnt[lp]==len[lp]){
if(lh[lp]==lh[rp])lcnt[p]+=lcnt[rp],lf[p]=lf[rp];
else lf[p]=lh[lp]>lh[rp];
}
if(rcnt[rp]==len[rp]){
if(rh[rp]==rh[lp])rcnt[p]+=rcnt[lp],rf[p]=rf[lp];
else rf[p]=rh[rp]>rh[lp];
}
if(rh[lp]>lh[rp]&&rf[lp])ans[p]+=rcnt[lp];
if(rh[lp]<lh[rp]&&lf[rp])ans[p]+=lcnt[rp];
if(rh[lp]==lh[rp]&&rf[lp]&&lf[rp])ans[p]+=rcnt[lp]+lcnt[rp];
}
void add(int p,int L,int R,int d){
if(L==le[p]&&R==ri[p]){
lz[p]+=d;
lh[p]+=d;rh[p]+=d;
return ;
}
int mid=(le[p]+ri[p])>>1;
make(lson[p],le[p],mid,rr);
make(rson[p],mid+1,ri[p],rr);
if(lz[p]){
add(lson[p],le[p],mid,lz[p]);
add(rson[p],mid+1,ri[p],lz[p]);
lz[p]=0;
}
if(R<=mid)add(lson[p],L,R,d);
else if(L>mid)add(rson[p],L,R,d);
else {
add(lson[p],L,mid,d);
add(rson[p],mid+1,R,d);
}
up(p);
}
int main(){
while(cin>>n>>q>>rr){
int aa=0;tot=1;
init(1,1,n,rr);
while(q--){
int a,b,r;
scanf("%d%d%d",&a,&b,&r);
a^=aa;b^=aa;r^=aa;
add(1,a,b,r);
aa=ans[1];
printf("%d\n",aa);
}
}
}
hdu 5367 线段树动态建树
最新推荐文章于 2021-07-31 20:02:01 发布