这个题又是把懒惰标记和动作状态混在一起了==还有push-up push-down 背了吧。。。

  好怕怕……  注意1和L!

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
    int l,r,lsum,rsum,sum,loop;
}tree[400000];
int Find_Max(int a,int b ,int c)
{
    int maxn=a>b?a:b;
    maxn=maxn>c?maxn:c;
    return maxn;
}
void push_down(int t)
{
    if(tree[t].loop!=-1)
    {
        tree[t<<1].loop=tree[t<<1|1].loop=tree[t].loop;
        if(tree[t].loop)
        {
            tree[t<<1].lsum=tree[t<<1].rsum=tree[t<<1].sum=0;
            tree[t<<1|1].lsum=tree[t<<1|1].rsum=tree[t<<1|1].sum=0;
        }
        else //if(tree[t].loop==0)
        {
            tree[t<<1].lsum=tree[t<<1].rsum=tree[t<<1].sum=tree[t<<1].r-tree[t<<1].l+1;
            tree[t<<1|1].lsum=tree[t<<1|1].rsum=tree[t<<1|1].sum=tree[t<<1|1].r-tree[t<<1|1].l+1;
        }
        tree[t].loop=-1;
    }
}
void push_up(int l,int r,int t)
{
    tree[t].lsum=tree[t<<1].lsum;
    tree[t].rsum=tree[t<<1|1].rsum;
    int x=(l+r)/2;
    if(tree[t].lsum==x-l+1) tree[t].lsum+=tree[t<<1|1].lsum;
    if(tree[t].rsum==r-x) tree[t].rsum+=tree[t<<1].rsum;
    tree[t].sum=Find_Max(tree[t<<1].sum,tree[t<<1|1].sum,tree[t<<1].rsum+tree[t<<1|1].lsum);///
}
void build(int l,int r,int t)
{
    tree[t].l=l,tree[t].r=r;
    tree[t].sum=tree[t].lsum=tree[t].rsum=r-l+1;
    tree[t].loop=-1;
    if(l==r) return;
    int x=(l+r)/2;
    build(l,x,2*t);
    build(x+1,r,2*t+1);
}
void update_tree(int l,int r,int t,int cnt)
{
    if(tree[t].l==l&&tree[t].r==r)
    {
        tree[t].loop=cnt;
        if(cnt) tree[t].lsum=tree[t].rsum=tree[t].sum=0;
        else tree[t].lsum=tree[t].rsum=tree[t].sum=r-l+1;
        return;
    }
    push_down(t);
    int x=(tree[t].l+tree[t].r)/2;
    if(x>=r) update_tree(l,r,2*t,cnt);
    else if(x+1<=l) update_tree(l,r,2*t+1,cnt);
    else
    {
        update_tree(l,x,2*t,cnt);
        update_tree(x+1,r,t<<1|1,cnt);
    }
    push_up(tree[t].l,tree[t].r,t);
}
int Query(int l,int r,int t,int cnt)
{
    if(l==r) return 1;
    int x=(l+r)/2;
    push_down(t);
    if(tree[t<<1].sum>=cnt) return Query(l,x,t<<1,cnt);
    else if(tree[t<<1].rsum+tree[t<<1|1].lsum>=cnt)return x-tree[t<<1].rsum+1;
    else return Query(x+1,r,t<<1|1,cnt);
}
int main()
{
   // freopen("cin.txt","r",stdin);
    int i,j,n,m,x,y;
    while(~scanf("%d%d",&n,&m))
    {
        build(1,n,1);
        while(m--)
        {
            scanf("%d",&i);
            if(i==1)
            {
                scanf("%d",&x);
                if(tree[1].sum<x)
                {
                    printf("0\n");
                    continue;
                }
                y=Query(1,n,1,x);
                printf("%d\n",y);
                update_tree(y,y+x-1,1,1);
            }
            else
            {
                scanf("%d%d",&x,&y);
                update_tree(x,x+y-1,1,0);
            }
        }
    }
    return 0;
}