RT.为什么我打的这个莫队的板子又慢又烂。是我哪里写错了吗?求助大佬
///*****Sellaris*****///
//#pragma once
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#define _USE_MINGW_ANSI_STDIO 1
#include <bits/stdc++.h>
//#include <bits/extc++.h>
#define ll long long
using namespace std;
//using namespace __gnu_pbds;
const int maxn=1e6+10;
//__gnu_pbds::tree <ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> TREE ;
inline int read(){
register int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
return ret*f; //x=(x<<1)+(x<<3)+(ch^48);
}
int n,m,a[maxn];
int s,cur;
int ans[maxn],num[maxn];
struct query{
int l,r,bel,id;
}q[maxn];
inline bool cmp(query a,query b){
if(a.bel==b.bel) { return (a.r<b.r); }
return (a.bel<b.bel) ;
}
inline void add(int p){
num[p]++;
if(num[p]==1) cur++;
return;
}
inline void del(int p){
num[p]--;
if(num[p]==0) cur--;
return;
}
signed main(){
//std::ios::sync_with_stdio(false);std::cin.tie(NULL);std::cout.tie(NULL);
//freopen(in.txt,r,stdin);freopen(out.txt,w,stdout);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
m=read();s=sqrt(n);
for(int i=1;i<=m;i++){
q[i].l=read();
q[i].r=read();
q[i].bel=(q[i].r-1)/s+1;
q[i].id=i;
}
std::sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l) del(a[l++]);
while(l>q[i].l) add(a[--l]);
while(r<q[i].r) add(a[++r]);
while(r>q[i].r) del(a[r--]);
ans[q[i].id]=cur;
}
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
return 0;
}