Files
SH-Quizzes/ACMOJ-1685.cpp
2023-12-23 22:23:48 +08:00

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;
}