直接写的带修莫队,记录答案用的map代码如下,而且当我ch只是一个char变量而不是数组时,读入ch改成scanf和getchar都会导致全WA也不知道为啥
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
int read(){
int x=0,f=1;char ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch = getchar();}
while(ch>='0'&&ch<='9'){x = x*10+ch-'0';ch = getchar();}
return x*f;
}
const int N = 1e5+5;
struct aaa{
int l,r,t,rk1,rk2,id,k;
bool operator<(const aaa &x)const{
if(rk1==x.rk1){
if(rk2==x.rk2){
return t<x.t;
}else{
return rk2<x.rk2;
}
}else{
return rk1<x.rk1;
}
}
}node[N];
int a[N];
int pla[N],book[N];
map<int,int>cnt;
int ans[N];
int main(){
int n,m;
n = read();m = read();
// int siz = sqrt(n);
int siz = pow(n,0.6666667);
for(int i=1;i<=n;i++){
a[i] = read();
}
char ch[5];
int tot=0,x=0;
for(int i=1;i<=m;i++){
// ch=getchar();
// cin>>ch;
scanf("%s",&ch);
if(ch[0]=='Q'){
tot++;
node[tot].l = read();node[tot].r = read();node[tot].k = read();node[tot].t = x;
node[tot].id = tot;node[tot].rk1 = (node[tot].l-1)/siz+1;node[tot].rk2 = (node[tot].r-1)/siz+1;
}else{
x++;
pla[x]=read();book[x]=read();
}
}
sort(node+1,node+1+tot);
int lx=1,rx=0,tx=0;
for(int i=1;i<=tot;i++){
while(lx>node[i].l){
lx--;
cnt[a[lx]]++;
}
while(rx<node[i].r){
rx++;
cnt[a[rx]]++;
}
while(lx<node[i].l){
cnt[a[lx]]--;
lx++;
}
while(rx>node[i].r){
cnt[a[rx]]--;
rx--;
}
while(tx<node[i].t){
tx++;
if(pla[tx]>=node[i].l&&pla[tx]<=node[i].r){
cnt[book[tx]]++;
cnt[a[pla[tx]]]--;
}
swap(a[pla[tx]],book[tx]);
}
while(tx>node[i].t){
if(pla[tx]>=node[i].l&&pla[tx]<=node[i].r){
cnt[book[tx]]++;
cnt[a[pla[tx]]]--;
}
swap(a[pla[tx]],book[tx]);
tx--;
}
ans[node[i].id] = cnt[node[i].k];
}
for(int i=1;i<=tot;i++){
cout<<ans[i]<<"\n";
}
return 0;
}