分块求调,#1-#7WA,其他TLE,样例过了。
#include<bits/stdc++.h>
#define N 150000
using namespace std;
int read()
{
int x = 0,f = 1;
char c = getchar();
while(c<'0' || c>'9')
{
if(c=='-') f = -1;
c = getchar();
}
while(c>='0' && c<='9')
{
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
return x*f;
}
int a[N],id[N],len,n,m;
set <int> s[N];
int query(int l,int r)
{
int start=id[l],end=id[r];
if (start==end)
{
set <int> st;
for (int i=l;i<=r;i++)
st.insert(a[i]);
return st.size();
}
int ans = 0;
set <int> st;
for (int i=l;id[i]==start;i++)
st.insert(a[i]);
ans += st.size();
for (int i=start+1;i<end;i++)
ans += s[i].size();
set <int> st2;
for (int i=r;id[i]==end;i--)
st2.insert(a[i]);
ans += st2.size();
return ans;
}
int main()
{
n=read(),m=read(),len=sqrt(n);
for (int i=1;i<=n;i++)
{
a[i]=read();
id[i]=(i-1)/len+1;
s[id[i]].insert(a[i]);
}
while(m--)
{
char c;
cin >> c;
int x=read(),y=read();
if (c=='Q') cout << query(x,y) << endl;
else
{
s[id[x]].erase(a[x]);
s[id[x]].insert(y);
a[x] = y;
}
}
return 0;
}