模板求调
查看原帖
模板求调
160150
WxjzKK楼主2023/7/18 17:17

rt

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
inline int read(){
	int s=0,t=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') t=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<3)+(s<<1)+c-'0';c=getchar();
	}
	return s*t;
}
inline void write(int n){
	if(n<0){
		putchar('-');write(-n);
	}
	else{
		if(n<10){
			putchar(n+'0');return;
		}
		write(n/10);putchar(n%10+'0');
	}
}
struct node{
	int sum,l,r;
}t[MAXN<<5];
int tot,a[MAXN],b[MAXN],c[MAXN],r[MAXN];
inline void build(int &rt,int l,int r){
	if(!rt) rt=++tot;
	t[rt].sum=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(t[rt].l,l,mid);build(t[rt].r,mid+1,r);
}
inline void update(int &rt,int rt_,int l,int r,int k){
	if(l<=k&&r>=k) rt=++tot;
	t[rt]=t[rt_];++t[rt].sum;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(mid>=k) update(t[rt].l,t[rt_].l,l,mid,k);
	else update(t[rt].r,t[rt_].r,mid+1,r,k);
}
inline int query(int rt1,int rt2,int l,int r,int k){
	if(l>=r) return a[l];
	int mid=(l+r)>>1;
	if(t[t[rt2].l].sum-t[t[rt1].l].sum>=k) return query(t[rt1].l,t[rt2].l,l,mid,k);
	else return query(t[rt1].r,t[rt2].l,mid+1,r,k-(t[t[rt2].l].sum-t[t[rt1].l].sum));
}
int main(){
	int n,m,q,x,y,k;
	n=read();m=read();
	for(register int i=1;i<=n;++i) a[i]=b[i]=read();
	sort(a+1,a+n+1);
	q=unique(a+1,a+n+1)-(a+1);
	build(r[0],1,q);
	for(register int i=1;i<=q;++i) c[i]=lower_bound(a+1,a+q+1,b[i])-a;
	for(register int i=1;i<=q;++i) update(r[i],r[i-1],1,q,c[i]);
	for(register int i=1;i<=m;++i){
		x=read();y=read();k=read();
		write(query(r[x-1],r[y],1,q,k));
		putchar('\n');
	}
	return 0;
}

2023/7/18 17:17
加载中...