RT。
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,sz,a[N];
int xga[N],xgp[N],xgy[N],cnt,cnt2;
int num[N<<1],lsh[N<<1],qwq;
struct ak{
int l,r,k;
int kl,kr,t,num;
}c[N];
int ans[N];
int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
bool cmp(ak aaa,ak bbb){
if(aaa.kl!=bbb.kl)return aaa.kl<bbb.kl;
if(aaa.kr!=bbb.kr)return aaa.kr<bbb.kr;
return aaa.t<bbb.t;
}
int main(){
n=read();m=read();
sz=pow(n,2.0/3.0);
for(int i(1);i<=n;++i)a[i]=read();
for(int i(1);i<=n;++i)lsh[++qwq]=a[i];
while(m--){
char cc;scanf(" %c",&cc);
if(cc=='Q'){
c[++cnt2].l=read();
c[cnt2].r=read();
c[cnt2].k=read();
c[cnt2].kl=c[cnt2].l/sz;
c[cnt2].kr=c[cnt2].r/sz;
c[cnt2].t=cnt;
c[cnt2].num=cnt2;
lsh[++qwq]=c[cnt2].k;
}
else{
xga[++cnt]=read();
xgp[cnt]=read();
xgy[cnt]=a[xga[cnt]];
lsh[++qwq]=xgp[cnt];
}
}sort(lsh+1,lsh+1+qwq);
qwq=unique(lsh+1,lsh+1+qwq)-lsh-1;
for(int i(1);i<=n;++i)a[i]=lower_bound(lsh+1,lsh+1+qwq,a[i])-lsh;
for(int i(1);i<=cnt;++i){
xgp[i]=lower_bound(lsh+1,lsh+1+qwq,xgp[i])-lsh;
xgy[i]=lower_bound(lsh+1,lsh+1+qwq,xgy[i])-lsh;
}
for(int i(1);i<=cnt2;++i)c[i].k=lower_bound(lsh+1,lsh+1+qwq,c[i].k)-lsh;
sort(c+1,c+1+cnt2,cmp);
int L=c[1].l,R=c[1].r,t=c[1].t;
for(int i(1);i<=t;++i)a[xga[i]]=xgp[i];
for(int i(L);i<=R;++i)++num[a[i]];
ans[c[1].num]=num[c[1].k];
for(int i(2);i<=cnt2;++i){
while(L>c[i].l){
--L;
++num[a[L]];
}
while(L<c[i].l){
--num[a[L]];
++L;
}
while(R>c[i].r){
--num[a[R]];
--R;
}
while(R<c[i].r){
++R;
++num[a[R]];
}
// cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<c[i].k<<" "<<num[c[i].k]<<'\n';
while(t>c[i].t){
a[xga[t]]=xgy[t];
if(xga[t]>R||xga[t]<L){
--t;continue;
}
--num[xgp[t]];
++num[xgy[t]];;
--t;
}
// cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<num[c[i].k]<<'\n';
while(t<c[i].t){
++t;
a[xga[t]]=xgp[t];
if(xga[t]>R||xga[t]<L)continue;
++num[xgp[t]];
--num[xgy[t]];
}
ans[c[i].num]=num[c[i].k];
// cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<num[c[i].k]<<'\n';
}
for(int i(1);i<=cnt2;++i)printf("%d\n",ans[i]);
return 0;
}
代码会输出负数 TMT
thx qwq