这个题有主席数和莫队的做法,现在还不会,留坑,以后补
用树状树状离线做,代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100005;
struct Node
{
int l,r,id;
}b[maxn];
int f[maxn],e[maxn],tot,bit[maxn],a[maxn],ans[maxn];
int n,q;
void add(int x)
{
while(x<=n) {
bit[x]++;
x+= x&-x;
}
}
int sum(int x)
{
int s=0;
while(x>0) {
s+=bit[x];
x-= x&-x;
}
return s;
}
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
int main()
{
while(~scanf("%d%d",&n,&q)) {
memset(f,0,sizeof(f));
memset(e,0,sizeof(e));
memset(bit,0,sizeof(bit));
tot=0;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++) {
if(f[a[i]]==0) {
f[a[i]]=i;
tot++;
}
e[a[i]]=i;
}
for(int i=1;i<=q;i++) {
scanf("%d%d",&b[i].l,&b[i].r);
b[i].id=i;
}
sort(b+1,b+1+q,cmp);
int r=1;
for(int i=1;i<=q;i++) {
while(r<b[i].r) {
if(e[a[r]]==r) {
tot--;
add(f[a[r]]);
}
r++;
}
ans[b[i].id]=tot+sum(b[i].l);
}
for(int i=1;i<=q;i++) {
printf("%d\n",ans[i]);
}
}
}