可持久化线段树做法样例没过求助玄关
查看原帖
可持久化线段树做法样例没过求助玄关
929151
xxr___楼主2024/11/12 12:33
#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
const int N=2e6+5;
int a[N],b[N],n,m,rt[N],l,r,k;
struct seg_t{
	struct node{
		int ls,rs,s;
	}t[N<<5];
	int idx=0;
	inline int upd(int pr,int l,int r,int x){
		int u=++idx;
		t[u].ls=t[pr].ls;
		t[u].rs=t[pr].rs;
		t[u].s=t[pr].s+1;
		if(l==r){
			return u;
		}
		int mid=(l+r)>>1;
		if(x<=mid) t[u].ls=upd(t[pr].ls,l,mid,x);
		else t[u].rs=upd(t[pr].rs,mid+1,r,x);
		return u;
	}
	inline int query(int now,int l,int r,int x){
		if(l==r){
			return t[now].s;
		}
		int mid=(l+r)>>1;
		if(x<=mid){
			return query(t[now].ls,l,mid,x);
		}else{
			return query(t[now].rs,mid+1,r,x);
		}
	}
}bit;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	rt[0]=0;
	up(i,1,n){
		cin>>a[i];b[i]=a[i];
	} 
	sort(b+1,b+n+1);
	int sz=unique(b+1,b+n+1)-b-1;
	up(i,1,n){
//		int rk=lower_bound(b+1,b+sz+1,a[i])-b;
		rt[i]=bit.upd(rt[i-1],1,2e6,a[i]);
	}
	up(i,1,m){
		cin>>l>>r>>k;
		cout<<bit.query(rt[r],1,2e6,k)-bit.query(rt[l-1],1,2e6,k)<<'\n';
	}
	return 0;
}
//tomxi
2024/11/12 12:33
加载中...