学带修莫队调吐了……
救救孩子吧
#include<bits/stdc++.h>
using namespace std;
struct que
{
int l,r,t,s;
}q[1000001];
struct cha
{
int p,x,last;
}c[1000001];
int n,m,F;
int ans_[1000001];
int cntq,cntc;
int color[1000001];
int sum[1000001];
bool cmp(que a,que b)
{
if(a.l/F!=b.l/F) return a.l/F<b.l/F;
else if(a.r/F!=b.r/F) return a.r/F<b.r/F;
else return a.t<b.t;
}
int main()
{
cin>>n>>m;
F=pow(n,1.0/3);
for(int i=1;i<=n;i++)
{
cin>>color[i];
}
char x;
int y,z;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
if(x=='Q')
{
q[++cntq].l=y;
q[cntq].r=z;
q[cntq].t=cntc;
q[cntq].s=cntq;
}
else
{
c[++cntc].p=y;
c[cntc].x=z;
}
}
sort(q+1,q+cntq+1,cmp);
int L=1,R=1,T=0,ans=0;
for(;T<cntc;)
{
T++;
c[T].last=color[c[T].p];
color[c[T].p]=c[T].x;
}
sum[color[L]]++;
ans++;
for(int i=1;i<=cntq;i++)
{
while(R<q[i].r)
{
R++;
if(++sum[color[R]]==1) ans++;
}
while(R>q[i].r)
{
if(!(--sum[color[R]])) ans--;
R--;
}
while(L>q[i].l)
{
L--;
if(++sum[color[L]]==1) ans++;
}
while(L<q[i].l)
{
if(!(--sum[color[L]])) ans--;
L++;
}
while(T>q[i].t)
{
if(!(--sum[color[c[T].p]])) ans--;
color[c[T].p]=c[T].last;
if(++sum[color[c[T].p]]==1) ans++;
T--;
}
while(T<q[i].t)
{
T++;
if(!(--sum[color[c[T].p]])) ans--;
color[c[T].p]=c[T].x;
if(++sum[color[c[T].p]]==1) ans++;
}
ans_[q[i].s]=ans;
}
for(int i=1;i<=cntq;i++)
{
cout<<ans_[i]<<endl;
}
}
/*
7 7
1 2 3 4 5 6 7
Q 1 7
Q 2 7
Q 3 7
R 5 6
Q 1 7
R 7 1
Q 1 7
7 3
1 2 3 4 5 6 7
Q 1 7
R 1 2
R 3 4
*/