谢谢
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
struct SGT{
#define lc u<<1
#define rc u<<1|1
struct Node{
int l, r, lres, rres, res, lazy;
void tag(int x){
if(x == 1){
lres = rres = res = 0;
lazy = 1;
}
else{
lres = rres = res = r - l + 1;
lazy = 2;
}
}
} t[N << 2];
void Up(Node & t, Node & ls, Node & rs){
t.lres = ls.lres;
t.rres = rs.rres;
if(ls.res == ls.r - ls.l + 1) t.lres = ls.res + rs.lres;
if(rs.res == rs.r - rs.l + 1) t.rres = ls.rres + rs.res;
t.res = max({ls.res, rs.res, ls.rres + rs.lres});
}
void Up(int u){
Up(t[u], t[lc], t[rc]);
}
void Dn(int u){
if(!t[u].lazy) return ;
t[lc].tag(t[u].lazy);
t[rc].tag(t[u].lazy);
t[u].lazy = 0;
}
void Build(int u, int l, int r){
t[u].l = l, t[u].r = r;
t[u].lres = t[u].rres = t[u].res = r - l + 1;
if(l == r) return ;
int mid = (l + r) >> 1;
Build(lc, l, mid);
Build(rc, mid + 1, r);
}
void Modify(int u, int L, int R, int type){
if(L <= t[u].l && t[u].r <= R){
t[u].tag(type);
return ;
}
Dn(u);
int mid = (t[u].l + t[u].r) >> 1;
if(L <= mid) Modify(lc, L, R, type);
if(R > mid) Modify(rc, L, R, type);
Up(u);
}
int Query(int u, int len){
if(t[u].res < len) return 0;
if(t[lc].res >= len) return Query(lc, len);
if(t[lc].rres + t[rc].lres >= len) return (t[lc].r - t[lc].rres + 1);
return Query(rc, len);
}
} sgt;
int n, m, i, x, y;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
sgt.Build(1, 1, n);
while(m--){
cin >> i >> x;
if(i == 1){
int res = sgt.Query(1, x);
if(res) sgt.Modify(1, res, res + x - 1, 1);
cout << res << '\n';
}
else{
cin >> y;
sgt.Modify(1, x, x + y - 1, 2);
}
}
return 0;
}