vlga,普通莫队做法求条
查看原帖
vlga,普通莫队做法求条
778251
alexshimingqian楼主2024/11/29 17:13
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
struct Node{
	int l,r,k,id;
}q[N];
int a[N],tmpans,ans[N],b[N],c[N];
int n,m,block;
int lowbit(int x){
	return x&(-x);
}
void update(int x,int num){
	while(x<=n){
		c[x]+=num;
		x+=lowbit(x);
	}
	return ;
}
int query(int x){
	int ans=0;
	while(x){
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}
bool cmp(Node x,Node y){
	return ((x.l-1)/block^(y.l-1)/block)?(x.l-1)/block<(y.l-1)/block:((((x.l-1)/block)&1)?x.r<y.r:x.r>y.r);
}
void add(int x){
	update(x,1);
}
void del(int x){
	update(x,-1);
}
signed main(){
	int l,r,ansl=1,ansr=0;
	cin>>n;
	block=sqrt(n);
	for(int i=1;i<=n;++i){
		cin>>a[i];
		b[i]=a[i];
	}
	int len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;++i){
		a[i]=lower_bound(b+1,b+len+1,a[i])-b;
	}
	cin>>m;
	for(int i=1;i<=m;++i){
		cin>>q[i].l>>q[i].r>>q[i].k;
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;++i){
		l=q[i].l,r=q[i].r;
		while(ansl>l) --ansl,add(a[ansl]);
		while(ansr<r) ++ansr,add(a[ansr]);
		while(ansl<l) del(a[ansl]),++ansl;
		while(ansr>r) del(a[ansr]),--ansr;
		int x=upper_bound(b+1,b+len+1,q[i].k)-b-1;
		ans[q[i].id]=(r-l+1)-query(x);
	}
	for(int i=1;i<=m;++i){
		cout<<ans[i]<<endl;
	}
	return 0;
}
2024/11/29 17:13
加载中...