用的set+BIT,不知道哪里错了/kel
#include<bits/stdc++.h>
#define int long long
#define N 2000005
#define lowbit(k) k&(-k)
#define IT set<node>::iterator
using namespace std;
int n,m,x,y,z,t[N],tag[N];
char opt[N];
struct node {
int l,r;
mutable int val;
node(int L, int R=-1, int Val=0):l(L), r(R), val(Val) {}
bool operator<(const node& o) const {
return l < o.l;
}
};
set<node>s;
void add(int p,int k){
// if(n==999361)return;
if(p<=0)return;
while(p<=n){
t[p]+=k;
p+=lowbit(p);
}
return;
}
int query(int p){
// if(n==999361)return 0;
int res=0;
while(p){
res+=t[p];
p-=lowbit(p);
}
return res;
}
IT spilt(int pos) {
// if(n==999361)return s.begin();
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos)return it;
it--;
int L=it->l,R=it->r;
int Val=it->val;
s.erase(it);
s.insert(node(L,pos-1,Val));
return s.insert(node(pos,R,Val)).first;
}
void assign(int l,int r,int V) {
// if(n==999361)return;
IT pl=spilt(l),pr=spilt(r+1);
for(;pl!=pr;pl++)add(pl->r+1,-tag[pl->val]+tag[V]),add(pl->l,tag[pl->val]-tag[V]);
pl=spilt(l),pr=spilt(r+1);
s.erase(pl,pr);
s.insert(node(l,r,V));
}
int q(int p){
// if(n==999361)return 0;
IT it=s.lower_bound(node(p));
if(it!=s.end()&&it->l<=p&&it->r>=p)return it->val;
it--;
return it->val;
}
signed main() {
scanf("%lld%lld",&n,&m);
s.insert(node(1,n,1));
s.insert(node(n+1,n+1,n+1));
for(int i=1;i<=m;i++){
scanf("%s",opt);
if(opt[0]=='A') {
scanf("%lld%lld",&x,&y);
tag[x]+=y;
}
else if(opt[0]=='C'){
scanf("%lld%lld%lld",&x,&y,&z);
assign(x,y,z);
}
else{
scanf("%lld",&x);
printf("%lld\n",query(x)+tag[q(x)]);
}
}
}