http://acm.hdu.edu.cn/showproblem.php?pid=4614
#include <cstdio> #include <cstring> #define N 60005 struct st { int x,y,sum,flag; }p[N * 4]; void build(int r,int x,int y) { p[r].x = x; p[r].y = y; p[r].sum = 0; p[r].flag = 0; if(x == y) return ; int mid = (x + y) >> 1,tem = r << 1; build(tem,x,mid); build(tem + 1,mid + 1,y); } int query(int r,int x,int y,int val) { int sum = 0; if(p[r].x == x && p[r].y == y) { if(val == 0) return(y - x + 1 - p[r].sum); else { int sum1; sum1 = p[r].sum; p[r].flag = 1; p[r].sum = 0; return sum1; } } int mid = (p[r].x + p[r].y) >> 1,tem = r << 1; if(p[r].flag == 1) { p[tem].sum = 0; p[tem].flag = 1; p[tem + 1].sum = 0; p[tem + 1].flag = 1; p[r].flag = 0; } else if(p[r].flag == -1) { p[tem].sum = (p[tem].y - p[tem].x + 1); p[tem].flag = -1; p[tem + 1].sum = (p[tem + 1].y - p[tem + 1].x + 1); p[tem + 1].flag = -1; p[r].flag = 0; } if(y <= mid) sum = query(tem,x,y,val); else if(x > mid) sum = query(tem + 1,x,y,val); else sum = query(tem,x,mid,val) + query(tem + 1,mid + 1,y,val); p[r].sum = p[tem].sum + p[tem + 1].sum; return sum; } void insert(int r,int x,int y) { if(p[r].x == x && p[r].y == y) { p[r].sum = y - x + 1; p[r].flag = -1; return ; } int mid = (p[r].x +p[r]. y) >> 1,tem = r << 1; if(p[r].flag == 1) { p[tem].sum = 0; p[tem].flag = 1; p[tem + 1].sum = 0; p[tem + 1].flag = 1; p[r].flag = 0; } else if(p[r].flag == -1) { p[tem].sum = (p[tem].y - p[tem].x + 1); p[tem].flag = -1; p[tem + 1].sum = (p[tem + 1].y - p[tem + 1].x + 1); p[tem + 1].flag = -1; p[r].flag = 0; } if(y <= mid) insert(tem,x,y); else if(x > mid) insert(tem + 1,x,y); else { insert(tem,x,mid); insert(tem + 1,mid + 1,y); } p[r].sum = p[tem].sum + p[tem + 1].sum; } int main() { int T; scanf("%d",&T); // printf("[pre]"); while(T --) { int n,m,a,b,k; scanf("%d %d",&n,&m); build(1,1,n); while(m --) { scanf("%d %d %d",&k,&a,&b); a = a + 1; if(k == 1) { int start = a,end = n,mid,uu = -1,st,en,ss; while(start <= end) { mid = (start + end) >> 1; if(query(1,a,mid,0) > 0) { uu = mid; end = mid - 1; } else start = mid + 1; } if(uu == -1) {printf("Can not put any one.\n");continue;} st = uu; start = uu;end = n; if(query(1,uu,n,0) <= b) { //printf("%d\n",query(1,uu,n,0)); while(start <= end) { mid = (start + end) >> 1; if(query(1,mid,n,0) > 0) { en = mid; start = mid + 1; } else end = mid - 1; } } else { ss = uu; while(start <= end) { mid = (start + end) >> 1; int count = query(1,ss,mid,0); if(count == b) { en = mid; end = mid - 1; } else if(count < b) start = mid + 1; else end = mid - 1; } } insert(1,st,en); printf("%d %d\n",st - 1,en - 1); } else printf("%d\n",query(1,a,b + 1,1)); } printf("\n"); } // printf("[/pre]\n"); return 0; }