一开始MLE,还以为是数组开大了,后来越来越不对劲
第一个点数组开1000都MLE,谁能解答
#include<cstdio>
#include<algorithm>
#include<set>
#define lc p<<1
#define rc p<<1|1
#define ct Chtholly_tree
#define Chtholly set<ct>::iterator
#define int long long
#define N 1000
using namespace std;
int n,q,col[N];
struct Segment_tree{
int val,tag;
}s[N];
void pushup(int p){s[p].val=s[lc].val+s[rc].val;}
void pushdown(int p,int l,int r){
if(!s[p].tag)return;
int mid=(l+r)/2;
s[lc].val+=(mid-l+1)*s[p].tag;
s[rc].val+=(r-mid)*s[p].tag;
s[lc].tag+=s[p].tag;
s[rc].tag+=s[p].tag;
s[p].tag=0;
}
void change(int p,int sl,int sr,int l,int r,int v){
if(sl>r||sr<l)return;
if(sl>=l&&sr<=r){
s[p].val+=v*(sr-sl+1);
s[p].tag+=v;
return;
}
pushdown(p,sl,sr);
int mid=(sl+sr)/2;
change(lc,sl,mid,l,r,v);change(rc,mid+1,sr,l,r,v);
pushup(p);
}
int query(int p,int sl,int sr,int x){
if(sl>x||sr<x)return 0;
if(sl==x&&sr==x)return s[p].val;
pushdown(p,sl,sr);
int mid=(sl+sr)/2;
return query(lc,sl,mid,x)+query(rc,mid+1,sr,x);
}
struct Chtholly_tree{
int l,r;
mutable int val;
ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
bool operator<(const ct &c)const{return l<c.l;}
};
set<ct>st;
Chtholly split(int p){
Chtholly it=st.lower_bound(ct(p,0,0));
if(it!=st.end()&&it->l==p)return it;
it--;ct tmp=*it;st.erase(it);
st.insert(ct(tmp.l,p-1,tmp.val));
return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int v){
Chtholly right=split(r+1),left=split(l);
st.erase(left,right);
st.insert(ct(l,r,v));
}
void assign_ans(int l,int r,int v){
Chtholly right=split(r+1),left=split(l),it=left;
for(;it!=right;it++)change(1,1,n,it->l,it->r,col[it->val]-col[v]);
st.erase(left,right);
st.insert(ct(l,r,v));
}
int query_ans(int x){
Chtholly right=split(x+1),left=split(x);
int ps=left->val;
assign(left->l,right->r,ps);
return query(1,1,n,x)+col[ps];
}
signed main(){
scanf("%lld%lld",&n,&q);
st.insert({1,n+1,1});
while(q--){
char s[10];
int l,r,c;
scanf("%s",s);
if(s[0]=='C'){
scanf("%lld%lld%lld",&l,&r,&c);
assign_ans(l,r,c);
}else if(s[0]=='A'){
scanf("%lld%lld",&c,&l);
col[c]+=l;
}else{
scanf("%lld",&l);
printf("%lld\n",query_ans(l));
}
}
return 0;
}