改过了(虽然结果没变)
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int ans[N],n,m,k;char ch;
int c[N],s[N],T,sum,t1,t2;
int ul[N],uv[N];
struct node
{
int l,r,id,up;
}opr[N];
bool cmp(node a,node b)
{
if(a.l/T==b.l/T)return a.r<b.r;
return a.l<b.l;
}
void Delete(int val)
{
c[s[val]]--;
if(c[s[val]]==0)sum--;
}
void Insert(int val)
{
if(c[s[val]]==0)sum++;
c[s[val]]++;
}
void Upd(int x,int l,int r)
{
int loc=ul[x];
if(l<=loc&&loc<=r)Delete(loc);
swap(uv[x],s[loc]);
if(l<=loc&&loc<=r)Insert(loc);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;T=pow(n,2/3);
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=m;i++)
{
cin>>ch;
if(ch=='Q'){
opr[++t1].id=t1;opr[t1].up=t2;
cin>>opr[t1].l>>opr[t1].r;
}
else{cin>>ul[++t2]>>uv[t2];}
}
sort(opr+1,opr+t1+1,cmp);
int dx=1,dy=0,dq=0;
for(int i=1;i<=t1;i++)
{
int qx=opr[i].l,qy=opr[i].r,qp=opr[i].up;
while(dq<qp){Upd(++dq,qx,qy);}
while(dx>qx){Insert(--dx);}
while(dy<qy){Insert(++dy);}
while(dq>qp){Upd(dq--,qx,qy);}
while(dx<qx){Delete(dx++);}
while(dy>qy){Delete(dy--);}
ans[opr[i].id]=sum;
}
for(int i=1;i<=t1;i++)cout<<ans[i]<<"\n";
}
```
by jsad @ 2023-10-09 16:25:30
哪个题
by Clebershao_PCL @ 2023-10-09 17:23:25
[《哪个题》](https://www.luogu.com.cn/problem/P1903)
by jsad @ 2023-10-09 17:42:25