看着“线段树”的算法标签狂写线段树,re得不知不觉,没感觉有错,调也调不出来
应该是线段树没玩明白
大佬求调
代码:
#include <bits/stdc++.h>
#define ull unsigned long long
#define ls(i) i<<1
#define rs(i) i<<1|1
#define mid l+r>>1
#define int long long //十年OI一场空,不开long long见祖宗
using namespace std;
using ll=long long;
inline void read(int& a) {
int w=1;char c;a=0;
while((c=getchar())<'0'||c>'9')if(c=='-')w=-1;
do a=a*10+(c^48); while((c=getchar())>='0'&&c<='9');
a*=w;
}
void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
return ;
}
const int N=1e9;
struct node{
int l,r,val;
};
node d[N];
int a[N];
int n,m,k,s,si;
void pushup(int now){
d[now].val=d[rs(now)].val+d[ls(now)].val;
}
void build(int now,int l,int r){
d[now].l=l,d[now].r=r;
if(l==r){d[now].val=a[l];return;}
build(ls(now),l,mid);
build(rs(now),mid+1,r);
pushup(now);
}
void updata(int now){
if(d[now].l==d[now].r){
if(d[now].l+k>=m)a[d[now].l+k]=d[now].val;
else s+=d[now].val;
d[now].val=0;
return;
}
updata(ls(now));
updata(rs(now));
}
void in(int now,int z){
if(d[now].l==d[now].r){d[now].val++;return;}
int miid=(d[now].l+d[now].r)>>1;
if(z<=miid)in(ls(now),z);
else in(rs(now),z);
pushup(now);
}
int query(int now,int k){
if(d[now].val<k)return -1;
if(d[now].l==d[now].r)return d[now].l;
if(d[ls(now)].val>=k)return query(ls(now),k);
else return query(rs(now),k-d[ls(now)].val);
}
signed main() {
read(n),read(m);
build(1,m,2e5);
for(int i=1;i<=n;i++){
char o;
int k;
cin>>o;
read(k);
if(o=='I')if(k>=m)in(1,k),si++;
else if(o=='A' or o=='S')if(o=='S')k=-k,updata(1),build(1,m,2e5);
else if(o=='F'){
if(k>si-s)cout<<-1<<endl;
else write(query(1,si-s-k+1)),cout<<endl;}
}
write(s);
return 0;
}
//
// ⠀⢸⣿⣿⣿⠀⣼⣿⣿⣦⡀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀ ⠀⢸⣿⣿⡟⢰⣿⣿⣿⠟⠁
// ⠀⠀⠀⠀⠀⠀⠀⢰⣿⠿⢿⣦⣀⠀⠘⠛⠛⠃⠸⠿⠟⣫⣴⣶⣾⡆
// ⠀⠀⠀⠀⠀⠀⠀⠸⣿⡀⠀⠉⢿⣦⡀⠀⠀⠀⠀⠀⠀ ⠛⠿⠿⣿⠃
// ⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⠀⠀⠹⣿⣶⡾⠛⠛⢷⣦⣄⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⠀⠀⠈⠉⣀⡀⠀ ⠀⠙⢿⡇
// ⠀⠀⠀⠀⠀⠀⢀⣠⣴⡿⠟⠋⠀⠀⢠⣾⠟⠃⠀⠀⠀⢸⣿⡆
// ⠀⠀⠀⢀⣠⣶⡿⠛⠉⠀⠀⠀⠀⠀⣾⡇⠀⠀⠀⠀⠀⢸⣿⠇
// ⢀⣠⣾⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⢀⣼⣧⣀⠀⠀⠀⢀⣼⠇
// ⠈⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡿⠋⠙⠛⠛⠛⠛⠛⠁
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⡿⠋⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⢾⠿⠋⠀