A了后三个点,求各位dalao帮忙调调。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum[1000001];
struct query{
int l,r;
int val;
int id;
int t;
}q[1000001];
int t=1;
int change_i[1000001];
int change_old[1000001];
int change_new[1000001];
int ans=0;
int sq;
bool cmp(query a, query b)
{
if(a.l/sq!=b.l/sq)
return a.l>b.l;
if(a.r/sq!=b.r/sq)
return a.r<b.r;
return a.t<b.t;
}
bool cmp1(query a,query b)
{
return a.id<b.id;
}
int Q;
int n;
int cnt=0;
int a[1000001];
signed main()
{
scanf("%lld",&n);
cin>>Q;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sq=pow(n,2*1.0/3);
for(int i=1;i<=Q;i++)
{
char op;
cin>>op;
if(op=='Q')
{
scanf("%lld",&q[++cnt].l);
scanf("%lld",&q[cnt].r);
q[cnt].id=cnt;
q[cnt].t=t;
}
if(op=='R')
{
int x,y;
cin>>x>>y;
change_i[t]=x;
change_old[t]=a[x];
change_new[t]=y;
t++;
}
}
sort(q+1,q+cnt+1,cmp);
int L=1,R=0,T=1;
for(int i=1;i<=cnt;i++)
{
while(T>q[i].t)
{
T--;
if(L<=change_i[T]&&R>=change_i[T]);
{
sum[change_new[T]]--;
sum[change_old[T]]++;
if(sum[change_new[T]]==0)
ans--;
if(sum[change_old[T]]==1)
ans++;
}
a[change_i[T]]=change_old[T];
}
while(T<q[i].t)
{
if(L<=change_i[T]&&R>=change_i[T]);
{
sum[change_new[T]]++;
sum[change_old[T]]--;
if(sum[change_old[T]]==0)
ans--;
if(sum[change_new[T]]==1)
ans++;
}
a[change_i[T]]=change_new[T];
T++;
}
while(q[i].l<L)
{
L--;
sum[a[L]]++;
if(sum[a[L]]==1)
ans++;
}
while(q[i].l>L)
{
sum[a[L]]--;
if(sum[a[L]]==0)
ans--;
L++;
}
while(q[i].r<R)
{
sum[a[R]]--;
if(sum[a[R]]==0)
ans--;
R--;
}
while(q[i].r>R)
{
R++;
sum[a[R]]++;
if(sum[a[R]]==1)
ans++;
}
q[i].val=ans;
}
sort(q+1,q+cnt+1,cmp1);
for(int i=1;i<=cnt;i++)
printf("%lld \n",q[i].val);
return 0;
}