1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include <bits/stdc++.h> using namespace std; const int MAXN=100010,RANGE=100002; struct State { int mx,seg,sl,sr; State (int a=0,int b=0,int c=0,int d=0) {mx=a,seg=b,sl=c,sr=d;} }s[MAXN<<2]; int n,x,y,z,tg[MAXN<<2]; set < pair<int,int> > st[MAXN]; State merge (State a,State b) { State c; c.mx=max(a.mx,b.mx); if (a.mx>b.mx) {c.sl=a.sl,c.sr=0,c.seg=a.seg;} else if (b.mx>a.mx) {c.sl=0,c.sr=b.sr,c.seg=b.seg;} else {c.sl=a.sl,c.sr=b.sr,c.seg=a.seg+b.seg-min(a.sr,b.sl);} return c; } void pd (int p) { if (tg[p]==-1) {return;} tg[p<<1]=tg[(p<<1)|1]=tg[p]; s[p<<1]=s[(p<<1)|1]=State(tg[p],1,1,1); tg[p]=-1; return; } void buildt (int p,int l,int r) { tg[p]=-1; if (l==r) {s[p]=State(0,1,1,1);return;} int mid=(l+r)>>1; buildt(p<<1,l,mid); buildt((p<<1)|1,mid+1,r); s[p]=merge(s[p<<1],s[(p<<1)|1]); return; } State query (int p,int l,int r,int xl,int xr) { if (xl<=l&&r<=xr) {return s[p];} pd(p); int mid=(l+r)>>1; if (xr<=mid) {return query(p<<1,l,mid,xl,xr);} else if (xl>mid) {return query((p<<1)|1,mid+1,r,xl,xr);} else {return merge(query(p<<1,l,mid,xl,xr),query((p<<1)|1,mid+1,r,xl,xr));} } void modify (int p,int l,int r,int xl,int xr,int v) { if (xr<l||r<xl) {return;} if (xl<=l&&r<=xr) { tg[p]=v; s[p]=State(v,1,1,1); return; } pd(p); int mid=(l+r)>>1; modify(p<<1,l,mid,xl,xr,v); modify((p<<1)|1,mid+1,r,xl,xr,v); s[p]=merge(s[p<<1],s[(p<<1)|1]); return; } int main () { buildt(1,1,RANGE); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d",&x,&y,&z); int ans=0;x+=2,y++; State nw=query(1,1,RANGE,x,y); ans=nw.seg-1; int tmp=query(1,1,RANGE,x,x).mx,tmp1=query(1,1,RANGE,x-1,x-1).mx,flg=0; set < pair<int,int> >::iterator it=st[x-1].lower_bound(make_pair(nw.mx,1e9)); while (it!=st[x-1].end()&&(*it).first<=nw.mx+z) { ans++; if ((*it).second<=nw.mx) {flg=1;} st[x-1].erase(it); it=st[x-1].lower_bound(make_pair(nw.mx,1e9)); } if (it!=st[x-1].end()&&(*it).second<=nw.mx) {flg=1;} if (flg==0&&tmp1>=nw.mx&&nw.sl==0) {ans++;} if (nw.sl==0) {st[x].insert(make_pair(nw.mx,tmp+1));} tmp=query(1,1,RANGE,y,y).mx,tmp1=query(1,1,RANGE,y+1,y+1).mx,flg=0; it=st[y+1].lower_bound(make_pair(nw.mx,1e9)); while (it!=st[y+1].end()&&(*it).first<=nw.mx+z) { ans++; if ((*it).second<=nw.mx) {flg=1;} st[y+1].erase(it); it=st[y+1].lower_bound(make_pair(nw.mx,1e9)); } if (it!=st[y+1].end()&&(*it).second<=nw.mx) {flg=1;} if (flg==0&&tmp1>=nw.mx&&nw.sr==0) {ans++;} if (nw.sr==0) {st[y].insert(make_pair(nw.mx,tmp+1));} modify(1,1,RANGE,x,y,nw.mx+z); printf("%d\n",ans); } return 0; }
|