RT,为什么会TLE?
#include<bits/stdc++.h>
#define int long long
#define end putchar('\n')
#define space putchar(' ')
using namespace std;
int n,a[2000005],q,bl[2000005],h,t[2000005],ans,out[2000005];
struct PIII{
int first,second,id;
}p[2000005];
inline int read(){
register char ch=getchar();
register int f=1,res=0;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
res*=10;
res+=(ch-'0');
ch=getchar();
}
return res*f;
}
inline void write(register int x){
if(x<0){
putchar('-');
x=-x;
}
if(x<=9){
putchar(x+'0');
}else{
write(x/10);
putchar(x%10+'0');
}
}
inline bool cmp(register PIII x,register PIII y){
if(bl[x.first]==bl[y.second]){
if(x.first&1){
return x.second<y.second;
}else{
return x.second>y.second;
}
}return x.first<y.first;
}
inline void del(register int x){
t[a[x]]--;
if(!t[a[x]])ans--;
}
inline void add(register int x){
if(!t[a[x]])ans++;
t[a[x]]++;
}
signed main(){
n=read();
for(register int i=1;i<=n;i++){
a[i]=read();
}
q=read();
for(register int i=1;i<=q;i++){
p[i].first=read(),p[i].second=read();
p[i].id=i;
}
register int h=sqrt(n);
for(int i=1;i<=n;i++){
bl[i]=i/h+1;
}
sort(p+1,p+1+q,cmp);
register int l=1,r=1;
ans=1,t[a[1]]=1;
for(register int i=1;i<=q;i++){
int ll=p[i].first,rr=p[i].second;
while(r<rr)r++,add(r);
while(r>rr)del(r),r--;
while(l<ll)del(l),l++;
while(l>ll)l--,add(l);
out[p[i].id]=ans;
}
for(register int i=1;i<=q;i++){
write(out[i]),end;
}
return 0;
}