题目:https://acm.ecnu.edu.cn/problem/3307/
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int N,Q;
int a[maxn],C[maxn];
map<int,int>mp;
vector<int>po[maxn];
int ans[maxn];
struct node
{
int l,r,id;
friend bool operator <(node a,node b)
{
return a.r<b.r;
}
}zz[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
for(int i=x;i<=N;i+=lowbit(i))
C[i]+=val;
}
int query(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
ans+=C[i];
return ans;
}
int main()
{
cin>>N>>Q;
mp.clear();
int id=1;
for(int i=1;i<=N;i++)
{
cin>>a[i];
if(!mp[a[i]])
{
mp[a[i]]=id;
a[i]=id++;
po[a[i]].clear();
po[a[i]].push_back(0);
}
else
a[i]=mp[a[i]];
}
for(int i=0;i<Q;i++)
{
int x,y;
cin>>x>>y;
zz[i].l=x;
zz[i].r=y;
zz[i].id=i;
}
sort(zz,zz+Q);
int pos=0;
for(int i=1;i<=N;i++)
{
int u=a[i];
po[u].push_back(i);
int len=po[u].size()-1;
if(len>=2)
{
if(len>2)//消除上一次含K个U值的区间更新
{
add(po[u][len-2-1]+1,-1);
add(po[u][len-2]+1,1);
}
add(po[u][len-2]+1,1);
add(po[u][len-2+1]+1,-1);
}
//更新这一次含有K个U值的区间
while(zz[pos].r==i)
{
ans[zz[pos].id]=query(zz[pos].l);
pos++;
}
}
for(int i=0;i<Q;i++)
{
cout << ans[i] << endl;
}
return 0;
}