这道题我用的是离线+离散化+线段树,第 3 个样例就是过不去。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n;
int value[N],len;
struct Node{
int opt,x,y;
}ask[N];
unordered_map<int,int> mp;
struct SegmentTree{
int l,r,x,lazy;
}tree[N<<2];
void push_up(int u){
}
void push_down(int u){
auto &root=tree[u],&lson=tree[u<<1],&rson=tree[u<<1];
if(root.lazy) lson.lazy=1,rson.lazy=1,root.lazy=0;
}
void build(int u,int l,int r){
if(l==r){tree[u]={l,r,0,0};return ;}
else{
tree[u].l=l,tree[u].r=r,tree[u].lazy=0;
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
}
void modify(int u,int x,int v){
if(tree[u].l==x&&tree[u].r==x){
if(tree[u].lazy) tree[u].lazy=0,tree[u].x=1+v;
else tree[u].x+=v;
if(tree[u].x<0) tree[u].x=0;
return ;
}
else{
push_down(u);
int mid=tree[u].l+tree[u].r>>1;
if(x<=mid) modify(u<<1,x,v);
else modify(u<<1|1,x,v);
}
}
int query(int u,int x){
if(tree[u].l==x&&tree[u].r==x){
if(tree[u].lazy) return 1;
return tree[u].x;
}
else{
push_down(u);
int mid=tree[u].l+tree[u].r>>1;
if(x<=mid) return query(u<<1,x);
else return query(u<<1|1,x);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++){
cin>>ask[i].opt;
ask[i].x=-1e15,ask[i].y=-1e15;
if(ask[i].opt==4) cin>>ask[i].x,value[++len]=ask[i].x;
else if(ask[i].opt<3) cin>>ask[i].x>>ask[i].y,value[++len]=ask[i].x;
}
sort(value+1,value+len+1);
len=unique(value+1,value+len+1)-value-1;
for(int i=1;i<=len;i++) mp[value[i]]=i;
for(int i=1;i<=n;i++) ask[i].x=mp[ask[i].x];
// cout<<"\n";
// for(int i=1;i<=n;i++) cout<<ask[i].opt<<" "<<ask[i].x<<" "<<ask[i].y<<"\n";
build(1,1,n);
for(int i=1;i<=n;i++){
if(ask[i].opt==1) modify(1,ask[i].x,ask[i].y);
else if(ask[i].opt==2) modify(1,ask[i].x,-ask[i].y);
else if(ask[i].opt==3) tree[1].lazy=1;
else cout<<query(1,ask[i].x)<<"\n";
// cout<<"i="<<i<<" query()="<<query(1,1)<<"\n";
}
return 0;
}