主席树求调
查看原帖
主席树求调
415256
Epoch_L楼主2022/10/1 15:23

我是 MnZn,只过了前2个点,求大佬指出错误

#include<bits/stdc++.h>
#define fi first
#define se second
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sum(x) tr[x].sum
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using ull=unsigned long long;
void read(int &x){
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<1)+(r<<3)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=2e5+7;
struct node{
	int ls,rs,sum;
}tr[N*32];
int a[N],n,T,b[N],t[N],root[N],cnt=1,len;
void init(){
	for(int i=1;i<=n;i++)b[i]=a[i];
	sort(b+1,b+n+1);
	len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++)
		t[i]=lower_bound(b+1,b+len+1,a[i])-b;
}
void build(int p,int l,int r){
	sum(p)=0;
	if(l==r)return;
	int mid=l+r>>1;
	ls(p)=++cnt;rs(p)=++cnt;
	build(ls(p),l,mid);build(rs(p),mid+1,r);
}
void change(int p,int q,int l,int r,int x,int k){
	if(l==r){
		sum(p)+=k;
		return;
	}
	ls(p)=ls(q);rs(p)=rs(q);
	int mid=l+r>>1;
	if(x<=mid){
		ls(p)=++cnt;
		change(ls(p),ls(q),l,mid,x,k);
	}
	else{
		rs(p)=++cnt;
		change(rs(p),rs(q),mid+1,r,x,k);
	}
	sum(p)=sum(ls(p))+sum(rs(p));
}
int query(int p,int q,int l,int r,int k){
	if(l==r)return b[l];
	int mid=l+r>>1;
	int bb=sum(ls(p))-sum(ls(q));
	if(bb>=k)return query(ls(p),ls(q),l,mid,k);
	else return query(rs(p),rs(q),mid+1,r,k-bb);
}
int main(){
	read(n);read(T);
	for(int i=1;i<=n;i++)read(a[i]);
	init();
	build(1,1,len);root[0]=1;
	for(int i=1;i<=n;i++){
		root[i]=++cnt;
		change(root[i],root[i-1],1,len,t[i],1);
	}
	while(T--){
		int x,y,k;
		read(x);read(y);read(k);
		printf("%d\n",query(root[y],root[x-1],1,len,k));
	}
	return 0;
}
2022/10/1 15:23
加载中...