1 #include<cmath>
2 #include<algorithm>
3 #include<cstdio>
4 #include<iostream>
5 #include<cstring>
6 using namespace std;
7 const int maxn=50009;
8
9 struct tree
10 {
11 int lzy,l,r;
12 int l_len,r_len,t_len;
13 int get_len()
14 {
15 return r-l+1;
16 }
17 int get_mid()
18 {
19 return (l+r)>>1;
20 }
21 void new_len()
22 {
23 t_len=r_len=l_len=(lzy?0:get_len());
24 }
25 }tr[maxn<<2];
26 int n,m,d[maxn];
27
28 void build(int x,int la,int ra)
29 {
30 tr[x].l=la;tr[x].r=ra;
31 tr[x].t_len=tr[x].r_len=tr[x].l_len=tr[x].get_len();
32 tr[x].lzy=0;//初始时旅馆没有客人
33 if(la==ra)return;
34 int mid=tr[x].get_mid();
35 build(x<<1,la,mid);
36 build(x<<1|1,mid+1,ra);
37 return;
38 }
39
40 int ask(int tot,int x)
41 {
42 if(tr[x].l==tr[x].r&&tot==1)
43 return tr[x].l;//只需要一间的时候
44 if(tr[x].lzy!=-1)
45 {
46 tr[x<<1].lzy=tr[x<<1|1].lzy=tr[x].lzy;
47 tr[x].lzy=-1;
48 tr[x<<1].new_len();tr[x<<1|1].new_len();
49 }
50 if(tr[x<<1].t_len>=tot)//在左区间找
51 return ask(tot,x<<1);
52 else if(tr[x<<1].r_len+tr[x<<1|1].l_len>=tot)//中间拼起来的区间刚好覆盖
53 return tr[x<<1].r-tr[x<<1].r_len+1;//直接返回此区间的左端点
54 else if(tr[x<<1|1].t_len>=tot)//在右区间里找
55 return ask(tot,x<<1|1);
56 else
57 return 0;//没有空房间啦qwq
58 }
59
60 void update(int x,int w,int la,int ra)
61 {
62 if(tr[x].l==la&&ra==tr[x].r)
63 {
64 tr[x].lzy=w;
65 tr[x].new_len();
66 return;
67 }
68 if(tr[x].lzy!=-1)
69 {//下传lazy标记
70 tr[x<<1].lzy=tr[x<<1|1].lzy=tr[x].lzy;
71 tr[x].lzy=-1;
72 tr[x<<1].new_len();//更新覆盖情况
73 tr[x<<1|1].new_len();
74 }
75 int mid=tr[x].get_mid();
76 if(la>mid)
77 update(x<<1|1,w,la,ra);
78 else if(ra<=mid)
79 update(x<<1,w,la,ra);
80 else
81 {
82 update(x<<1,w,la,mid);
83 update(x<<1|1,w,mid+1,ra);
84 }
85
86 int tmp=max(tr[x<<1].t_len,tr[x<<1|1].t_len);
87 tr[x].t_len=max(tmp,tr[x<<1].r_len+tr[x<<1|1].l_len);
88 tr[x].l_len=tr[x<<1].l_len;
89 tr[x].r_len=tr[x<<1|1].r_len;
90
91 if(tr[x<<1].t_len==tr[x<<1].get_len())
92 tr[x].l_len+=tr[x<<1|1].l_len;
93
94 if(tr[x<<1|1].t_len==tr[x<<1|1].get_len())
95 tr[x].r_len+=tr[x<<1].r_len;
96 return;
97 }
98
99 int main()
100 {
101 scanf("%d%d",&n,&m);
102 build(1,1,n);
103 while(m--)
104 {
105 int op;
106 scanf("%d",&op);
107 if(op==1)
108 {
109 int tot;
110 scanf("%d",&tot);
111 int ans=ask(tot,1);
112 cout<<ans<<endl;//从头开始找
113 if(ans)
114 update(1,1,ans,ans+tot-1);//标记已经住进去
115 }
116 else if(op==2)
117 {
118 int la,len;
119 scanf("%d%d",&la,&len);
120 update(1,0,la,la+len-1);//清空房间
121 }
122 }
123 return 0;
124 }