71 lines
1.3 KiB
C++
71 lines
1.3 KiB
C++
#include<iostream>
|
|
#include<cstring>
|
|
#include<algorithm>
|
|
#include<vector>
|
|
#include<set>
|
|
#include<map>
|
|
#include<cassert>
|
|
#include<cmath>
|
|
#define lowbit(x) ((x)&(-(x)))
|
|
using namespace std;
|
|
const int maxn=5e5+10;
|
|
int a[maxn],N,Q,mp[maxn],QL[maxn],QR[maxn],qid[maxn],res[maxn];
|
|
int BST[maxn];
|
|
int L1[maxn],L2[maxn],L3[maxn];
|
|
bool cmp(int q1,int q2)
|
|
{
|
|
return (QR[q1]!=QR[q2])?QR[q1]<QR[q2]:QL[q1]<QL[q2];
|
|
}
|
|
void Add(int x,int y)
|
|
{
|
|
x++;
|
|
for(;x<=N+1;x+=lowbit(x)) BST[x]+=y;
|
|
}
|
|
int query(int x)
|
|
{
|
|
x++;
|
|
int res=0;
|
|
for(;x;x-=lowbit(x)) res+=BST[x];
|
|
return res;
|
|
}
|
|
int main()
|
|
{
|
|
#ifdef local
|
|
freopen("pro.in","r",stdin);
|
|
#endif
|
|
scanf("%d%d",&N,&Q);
|
|
set<int> st;
|
|
for(int i=1;i<=N;i++)
|
|
{
|
|
scanf("%d",&a[i]);
|
|
st.insert(a[i]);
|
|
}
|
|
map<int,int> hsh;
|
|
int hcnt=0;
|
|
for(auto it=st.begin();it!=st.end();it++) hsh[*it]=++hcnt;
|
|
for(int i=1;i<=N;i++) a[i]=hsh[a[i]];
|
|
for(int i=1;i<=Q;i++)
|
|
{
|
|
scanf("%d%d",&QL[i],&QR[i]);
|
|
qid[i]=i;
|
|
}
|
|
sort(qid+1,qid+1+Q,cmp);
|
|
int qp=1;
|
|
for(int i=1;i<=N;i++)
|
|
{
|
|
Add(L3[a[i]],+1);
|
|
L3[a[i]]=L2[a[i]];
|
|
Add(L3[a[i]],-1);
|
|
Add(L2[a[i]],-1);
|
|
L2[a[i]]=L1[a[i]];
|
|
Add(L2[a[i]],+1);
|
|
L1[a[i]]=i;
|
|
while(QR[qid[qp]]==i)
|
|
{
|
|
res[qid[qp]]=query(i)-query(QL[qid[qp]]-1);
|
|
qp++;
|
|
}
|
|
}
|
|
for(int i=1;i<=Q;i++) printf("%d\n",res[i]);
|
|
return 0;
|
|
} |