#include <stdio.h>#include<string.h>#include<algorithm>using namespacestd;#defineMAXN 100010#defineLson l,m,rt<<1#defineRson m+1,r,rt<<1|1intsum[maxn<<2],mark[maxn<<2];intb[maxn*3],X[MAXN],Y[MAXN],QUE[MAXN];intFindintVintk) { intL,m,r; L=1; R=K; while(l<=r) {m= (l+r)/2; if(b[m]==v)returnm; Else if(b[m]>v) r=m-1; Elsel=m+1; } return-1;}voidPushup (intRT) {Sum[rt]=sum[rt<<1]+sum[rt<<1|1];}voidPushdown (intRT) { if(Mark[rt]) {mark[rt<<1]+=Mark[rt]; Mark[rt<<1|1]+=Mark[rt]; Sum[rt<<1]+=Mark[rt]; Sum[rt<<1|1]+=Mark[rt]; MARK[RT]=0; }}voidBuildintLintRintRT) {Mark[rt]=sum[rt]=0; if(l==r) {return ; } intM= (L+R)/2; Build (Lson); Build (Rson);}voidUpdata (intLintRintCintLintRintRT) { if(l>=l&&r>=R) {Sum[rt]+=C; MARK[RT]+=C; return ; } pushdown (RT); intM= (L+R)/2; if(m>=L) Updata (L,r,c,lson); if(r>m) updata (L,r,c,rson); Pushup (RT);}intQueryintPintLintRintRT) { if(l==r) {returnSum[rt]; } pushdown (RT); intM= (L+R)/2; if(m>=p)returnquery (P,lson); Else returnquery (P,rson);}intMain () {intt,i,n,m,ff=0; scanf ("%d",&t); while(t--) { intnum=1; scanf ("%d%d",&n,&m); for(i=0; i<n;i++) {scanf ("%d%d",&x[i],&Y[i]); B[num++]=X[i]; B[num++]=Y[i]; } for(i=0; i<m;i++) {scanf ("%d",&Que[i]); B[num++]=Que[i]; } sort (B+1, B +num); intk=2; for(i=2; i<num;i++) { if(b[i]!=b[i-1]) {b[k++]=B[i]; } } for(i=k-1;i>1; i--) { if(b[i]!=b[i-1]+1) B[k++]=b[i-1]+1; } sort (B+1, B +k); Build (1, K-1,1); for(i=0; i<n;i++) { intFx=find (x[i],k-1); intFy=find (y[i],k-1); //printf ("%d%d\n", fx,fy);Updata (Fx,fy,1,1, K-1,1); } printf ("Case #%d:\n",++ff); for(i=0; i<m;i++) { intFp=find (que[i],k-1); printf ("%d\n", Query (FP,1, K-1,1)); } }}
hdu4325 Segment Tree Segment update