代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n,q,g[2000005],a[2000005];
struct xds{
int l,r;
LL sum,dum;
}t[2000005*4];
void back(int p){
t[p].sum=t[p*2].sum+t[p*2+1].sum;
t[p].dum=t[p*2].dum+t[p*2+1].dum;
}
void biuld(int l,int r,int p){
t[p].l=l;t[p].r=r;
if(l==r){t[p].sum=a[l],t[p].dum=a[l]*l;return ;}
int mid=(l+r)>>1;
biuld(l,mid,2*p);
biuld(mid+1,r,2*p+1);
back(p);
}
void change(int x,int p){
if(t[p].l==t[p].r){
t[p].sum=a[t[p].l];t[p].dum=a[t[p].l]*t[p].l;
return ;
}
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid)change(x,2*p);
else change(x,2*p+1);
back(p);
}
LL asksum(int l,int r,int p){
if(t[p].l>=l&&t[p].r<=r)return t[p].sum;
else if(t[p].r<l||t[p].l>r)return 0;
else return asksum(l,r,2*p)+asksum(l,r,2*p+1);
}
LL askdum(int l,int r,int p){
if(t[p].l>=l&&t[p].r<=r)return t[p].dum;
else if(t[p].r<l||t[p].l>r)return 0;
else return askdum(l,r,2*p)+askdum(l,r,2*p+1);
}
int main (){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
int a;cin>>a;g[a]++;
}
for(int i=1;i<=n;i++)a[g[i]]++;
biuld(1,2*n,1);
while(q--){
int op,x;
cin>>op>>x;
if(op==1){
a[g[x]]--;change(g[x],1);
g[x]++;a[g[x]]++;change(g[x],1);
}
if(op==2){
a[g[x]]--;change(g[x],1);
g[x]--;a[g[x]]++;change(g[x],1);
}
if(op==3){
LL ans=askdum(x+1,2*n,1)-x*asksum(x+1,2*n,1);
cout<<ans<<'\n';
}
}
return 0;
}
它只 WA 一个点是因为什么问题,有大佬能解答(DEBUG)一下吗?