FHQ RE 30pts 求助(悬关)
查看原帖
FHQ RE 30pts 求助(悬关)
706523
AlicX楼主2024/7/26 17:00

rt

#include<bits/stdc++.h>
#define int long long 
#define x first 
#define y second 
#define il inline 
#define debug() puts("-----")
using namespace std; 
typedef pair<int,int> pii; 
il int read(){ 
	int x=0,f=1; char ch=getchar(); 
	while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } 
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 
	return x*f; 
} 
const int N=1e6+10; 
int rt; 
struct Node{
    int key; 
    int ls,rs; 
    int val,siz; 
}tr[N]; int idx=0; 
il void pushup(int u){ 
    tr[u].siz=tr[tr[u].ls].siz+tr[tr[u].rs].siz+1; 
} 
il int build(int val){ 
    tr[++idx]={rand(),0,0,val,1}; 
    return idx;  
} 
il void split_val(int u,int val,int &x,int &y){
    if(!u){ x=0,y=0; return ; } 
    if(tr[u].val<=val) x=u,split_val(tr[u].rs,val,tr[u].rs,y); 
    else y=u,split_val(tr[u].ls,val,x,tr[u].ls); pushup(u);   
} 
il void split_siz(int u,int siz,int &x,int &y){ 
    if(!u){ x=0,y=0; return ; } 
    if(tr[tr[u].ls].siz+1<=siz) x=u,split_siz(tr[u].rs,siz-tr[tr[u].ls].siz-1,tr[u].rs,y); 
    else y=u,split_siz(tr[u].ls,siz,x,tr[u].ls); pushup(u); 
} 
il int merge(int x,int y){
    if(!x||!y) return x|y; 
    if(tr[x].key<tr[y].key){ 
        tr[x].rs=merge(tr[x].rs,y); 
        pushup(x); return x; 
    } tr[y].ls=merge(x,tr[y].ls); 
    pushup(y); return y; 
} 
int cnt=0; 
il int rnk(int x){ 
    int t1,t2,t3; 
    split_siz(rt,x,t1,t2); split_siz(t1,x-1,t1,t3); 
    int res=tr[t3].val; rt=merge(merge(t1,t3),t2);
    return res; 
} 
il void add(int x){ 
    int t1,t2; 
    split_val(rt,x,t1,t2); 
    rt=merge(merge(t1,build(x)),t2);
} 
il void del(int x){ 
    int t1,t2,t3; 
    split_val(rt,x,t1,t2); split_val(t1,x-1,t1,t3); 
    t3=merge(tr[t3].ls,tr[t3].rs); rt=merge(merge(t1,t3),t2); 
} 
signed main(){ 
    int ans=0; 
    int n=read(),Min=read(); 
    while(n--){ 
        char op; int x; 
        cin>>op; x=read(); 
        if(op=='I'){ 
            if(x<Min) continue; 
            add(x),cnt++; 
        } else if(op=='A'){ 
            vector<int> vec; 
            for(int i=1;i<=cnt;i++){ 
                int val=rnk(i); 
                vec.push_back(val); 
            } for(auto u:vec) del(u),add(u+x); 
        } else if(op=='S'){ 
            int num=0; 
            vector<int> vec; 
            for(int i=1;i<=cnt;i++){ 
                int val=rnk(i); 
                vec.push_back(val); 
            } for(auto u:vec){ 
                del(u); 
                if(u-x<Min) num++; 
                else add(u-x); 
            } cnt-=num,ans+=num; 
        } else{ 
            if(x>cnt) puts("-1"); 
            else printf("%lld\n",rnk(cnt-x+1)); 
        } 
    } printf("%lld\n",ans); 
    return 0; 
} 
2024/7/26 17:00
加载中...