玄关求条16tps
查看原帖
玄关求条16tps
1016188
fztt_r9楼主2024/7/8 20:58
#include<bits/stdc++.h>
using namespace std;
int sum[1000005],p[1000005],b[1000005];
int lowbit(int x){return x&(-x);}
void add(int *d,int x,int v){for(x;x<=1000000;x+=lowbit(x)) d[x]+=v;}
struct node{
	int l,r,id,ans;
}a[1000005];
bool cmp(node a,node b){return a.r<b.r;}
bool cmp2(node a,node b){return a.id<b.id;}
int get(int x){
	int ret=0;
	for(x;x>0;x-=lowbit(x)){ret+=sum[x];}
	return ret;
}
int main(){
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++){cin>>b[i];}
	cin>>m;
	for(int i=1;i<=m;i++){cin>>a[i].l>>a[i].r;a[i].id=i;}
	sort(a+1,a+1+m,cmp);
	for(int i=1,j=1;i<=n;i++){
		if(p[b[i]]!=0) add(sum,b[i],-1);p[b[i]]=i;
		add(sum,i,1);
		while(a[j].r==i){a[j].ans=get(a[j].r)-get(a[j].l-1);j++;}
	}
	sort(a+1,a+1+m,cmp2);
	for(int i=1;i<=m;i++) cout<<a[i].ans<<endl;
}
2024/7/8 20:58
加载中...