8分求调
查看原帖
8分求调
952033
lutaoquan2012楼主2023/12/19 16:58
//
// Created by 55062 on 2023/12/10.
//
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
    ll len,num,lnum,rnum,tag;
}a[200030];
void pushup(ll x){
    a[x].lnum=a[x*2].lnum;
    if(a[x*2].lnum==a[x*2].len) a[x].lnum=a[x*2+1].lnum+a[x*2].num;
    a[x].rnum=a[x*2+1].rnum;
    if(a[x*2+1].rnum==a[x*2+1].len) a[x].rnum=a[x*2+1].num+a[x*2].rnum;
    a[x].num=a[x*2].rnum+a[x*2+1].lnum;
    a[x].num=max(a[x].num,a[x*2].lnum);
    a[x].num=max(a[x].num,a[x*2+1].rnum);
}void build(ll x,ll l,ll r){
    a[x].len=r-l+1;
    if(l==r){
        a[x].num=a[x].lnum=a[x].rnum=1;
        return ;
    }ll mid=(l+r)/2;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    pushup(x);
}void Tag(ll x,ll l,ll r,ll tag){
    if(tag==1){
        a[x].num=a[x].lnum=a[x].rnum=0;
        a[x].tag=1;
    }else{
        a[x].num=a[x].lnum=a[x].rnum=r-l+1;
        a[x].tag=2;
    }
}void pushdown(ll x,ll l,ll r){
    if(a[x].tag==0) return ;
    ll mid=(l+r)/2;
    Tag(x*2,l,mid,a[x].tag);
    Tag(x*2+1,mid+1,r,a[x].tag);
    a[x].tag=0;
}ll query(ll x,ll l,ll r,ll k){
    if(a[x].num<k) return 0;
    if(l==r) return l;
    ll mid=(l+r)/2;
    pushdown(x,l,r);
    if(a[x*2].num>=k) return query(x*2,l,mid,k);
    if(a[x*2].rnum+a[x*2+1].lnum>=k) return mid+1-a[x*2].rnum;
    /*if(a[x*2+1].num>=k)*/ return query(x*2+1,mid+1,r,k);
    //return 0;
}void checkIn(ll x,ll l,ll r,ll L,ll R){
    if(L<=l&&r<=R){
        a[x].num=a[x].lnum=a[x].rnum=0;
        a[x].tag=1;
        return ;
    }pushdown(x,l,r);
    ll mid=(l+r)/2;
    if(L<=mid) checkIn(x*2,l,mid,L,R);
    if(mid<R) checkIn(x*2+1,mid+1,r,L,R);
    pushup(x);
}void checkOut(ll x,ll l,ll r,ll L,ll R){
    if(L<=l&&r<=R){
        a[x].num=a[x].lnum=a[x].rnum=r-l+1;
        a[x].tag=2;
        return ;
    }pushdown(x,l,r);
    ll mid=(l+r)/2;
    if(L<=mid) checkOut(x*2,l,mid,L,R);
    if(mid<R) checkOut(x*2+1,mid+1,r,L,R);
    pushup(x);
}
ll n,m,opt,x,y;
int main(){
    cin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=m;i++){
        cin>>opt;
        if(opt==1){
            cin>>x;
            ll pos= query(1,1,n,x);
            cout<<pos<<endl;
            if(pos!=0) checkIn(1,1,n,pos,pos+x-1);
        }else{
            cin>>x>>y;
            checkOut(1,1,n,x,x+y-1);
        }
    }
    return 0;
}
2023/12/19 16:58
加载中...