首先要读懂题吧 任何骑士进入的时间大于 询问的t都不用考虑 而到达时间小于t的询问 我们要找出他们离开的最大值
他们全离开后才是公主进入的时间 我们询问1到t的最大后缀和 用这个时间减去t就是等待时间了
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
ll sum[N<<2],mx[N<<2];
#define pa pair<int,int>
pa q[N];
void pushup(int id){
sum[id]=sum[id<<1]+sum[id<<1|1];
mx[id]=max(mx[id<<1|1],sum[id<<1|1]+mx[id<<1]);
}
void build(int id,int l,int r){
if(l==r){
mx[id]=l;sum[id]=0;
return;
}
int mid = l+r>>1;
build(id<<1,l,mid);build(id<<1|1,mid+1,r);
pushup(id);
}
void update(int id,int l,int r,int pos,int v){
if(l==r){
sum[id]+=v;mx[id]+=v;
return;
}
int mid = l+r>>1;
if(pos<=mid) update(id<<1,l,mid,pos,v);
else update(id<<1|1,mid+1,r,pos,v);
pushup(id);
}
ll ans;
void query(int id,int l,int r,int pos){
if(r<=pos) {
ans=max(ans+sum[id],mx[id]);
return;
}
int mid = l+r>>1;
query(id<<1,l,mid,pos);
if(pos>mid) query(id<<1|1,mid+1,r,pos);
}
int main(){
int n;
scanf("%d",&n);
build(1,1,1000000);
char op[3];int a,b;
for(int i = 1; i <= n; i++){
scanf("%s",op);
if(op[0]=='?'){
scanf("%d",&a);
ans = 0;
query(1,1,1000000,a);
printf("%lld\n",max(0ll,ans-a));
}else if(op[0]=='+'){
scanf("%d%d",&a,&b);
update(1,1,1000000,a,b);
q[i]=make_pair(a,b);
}else{
scanf("%d",&a);
update(1,1,1000000,q[a].first,-q[a].second);
}
}
return 0;
}