http://poj.org/problem?id=3667
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio>
2 using namespace std;
3 const int N=50010;
4 struct segtree
5 {
6 int l,r,s,ls,rs,c;
7 int m() {return (l+r)/2;}
8 int len() {return r-l+1;}
9 void set(int x)
10 {
11 c=x;
12 if (x==0) s=ls=rs=len();
13 else s=ls=rs=0;
14 }
15 }st[N*4];
16 void build(int l,int r,int rt)
17 {
18 st[rt].l=l; st[rt].r=r;
19 st[rt].s=st[rt].ls=st[rt].rs=st[rt].len();
20 st[rt].c=-1;
21 if (l==r) return;
22 int m=(l+r)/2;
23 build(l,m,rt*2);
24 build(m+1,r,rt*2+1);
25 }
26 int max(int x,int y,int z)
27 {
28 int t=x>y?x:y;
29 if (z>t) t=z;
30 return t;
31 }
32 void pushup(int rt)
33 {
34 int lrt=rt*2,rrt=rt*2+1;
35 st[rt].s=max(st[lrt].s,st[rrt].s,st[lrt].rs+st[rrt].ls);
36 st[rt].ls=st[lrt].ls;
37 if (st[lrt].ls==st[lrt].len()) st[rt].ls+=st[rrt].ls;
38 st[rt].rs=st[rrt].rs;
39 if (st[rrt].rs==st[rrt].len()) st[rt].rs+=st[lrt].rs;
40 }
41 void pushdown(int rt)
42 {
43 if (st[rt].c==-1) return;
44 int lrt=rt*2,rrt=rt*2+1;
45 st[lrt].c=st[rrt].c=st[rt].c;
46 st[lrt].set(st[rt].c);
47 st[rrt].set(st[rt].c);
48 st[rt].c=-1;
49 }
50 void update(int a,int b,int x,int rt)
51 {
52 int l=st[rt].l,r=st[rt].r;
53 if (a<=l && r<=b)
54 {
55 st[rt].set(x);
56 return;
57 }
58 pushdown(rt);
59 int m=st[rt].m();
60 int lrt=rt*2,rrt=rt*2+1;
61 if (a<=m) update(a,b,x,lrt);
62 if (b>m) update(a,b,x,rrt);
63 pushup(rt);
64 }
65 int query(int x,int rt)
66 {
67 if (st[rt].len()==1) return st[rt].l;
68 pushdown(rt);
69 int lrt=rt*2,rrt=rt*2+1;
70 if (st[lrt].s>=x) return query(x,lrt);
71 if (st[lrt].rs+st[rrt].ls>=x) return st[lrt].r-st[lrt].rs+1;
72 return query(x,rrt);
73 }
74 int main()
75 {
76 int n,m;
77 scanf("%d%d",&n,&m);
78 build(1,n,1);
79 while (m--)
80 {
81 int op,a,b;
82 scanf("%d",&op);
83 if (op==1)
84 {
85 scanf("%d",&a);
86 if (st[1].s<a)
87 {
88 printf("0\n");
89 continue;
90 }
91 int p=query(a,1);
92 printf("%d\n",p);
93 update(p,p+a-1,1,1);
94 }
95 else
96 {
97 scanf("%d%d",&a,&b);
98 update(a,a+b-1,0,1);
99 }
100 }
101 return 0;
102 }