//Accepted 3728 KB 1079 ms
//线段树 区间合并
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
/**
* This is a documentation comment block
* 如果有一天你坚持不下去了,就想想你为什么走到这儿!
* @authr songt
*/
;
struct node
{
int l,r;
int L1,R1;
int sum1;
int change; //change -1 区间没有改变 0区间变成0 1区间变成1
}f[imax_n*];
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
void pushUp(int t)
{
*t].r-f[*t].l+;
*t+].r-f[*t+].l+;
f[t].L1=f[*t].L1;
*t].L1==lLen) f[t].L1+=f[*t+].L1;
f[t].R1=f[*t+].R1;
*t+].R1==rLen) f[t].R1+=f[*t].R1;
f[t].sum1=max(f[*t].sum1,f[*t+].sum1);
f[t].sum1=max(f[t].sum1,f[*t].R1+f[*t+].L1);
}
void pushDown(int t)
{
)
{
f[*t].change=f[t].change;
f[*t+].change=f[t].change;
f[t].change=-;
f[*t].L1=f[*t].R1=f[*t].sum1=(f[*t].r-f[*t].l+)*f[*t].change;
f[*t+].L1=f[*t+].R1=f[*t+].sum1=(f[*t+].r-f[*t+].l+)*f[*t+].change;
}
}
void build(int t,int l,int r)
{
f[t].l=l;
f[t].r=r;
f[t].change=-;
if (l==r)
{
f[t].L1=f[t].R1=f[t].sum1=;
return ;
}
;
build(*t,l,mid);
build(*t+,mid+,r);
pushUp(t);
}
void update(int t,int l,int r,int c)
{
if (f[t].l==l && f[t].r==r)
{
f[t].change=c;
f[t].L1=f[t].R1=f[t].sum1=f[t].change*(f[t].r-f[t].l+);
return ;
}
pushDown(t);
;
*t,l,r,c);
else
{
*t+,l,r,c);
else
{
update(*t,l,mid,c);
update(*t+,mid+,r,c);
}
}
pushUp(t);
}
int query(int t,int k)
{
//printf("f[%d].sum1=%d\n",t,f[t].sum1);
if (f[t].l==f[t].r)
{
;
else return f[t].l;
}
pushDown(t);
;
*t].sum1>=k) *t,k);
*t].R1+f[*t+].L1>=k) *t].r-f[*t].R1+;
*t+].sum1>=k) *t+,k);
;
}
int n,m;
int op,x,y;
void slove()
{
build(,,n);
;i<=m;i++)
{
scanf("%d",&op);
)
{
scanf("%d",&x);
,x);
//printf("query=%d\n",t);
)
printf("0\n");
else
{
printf("%d\n",t);
update(,t,t+x-,);
}
}
else
{
scanf("%d%d",&x,&y);
update(,x,x+y-,);
}
}
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
slove();
}
;
}