主席树 区间第k大 10pts 求调
查看原帖
主席树 区间第k大 10pts 求调
289296
zymooll楼主2023/4/27 20:46

只过了 #1.

// Author:zymooll

#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define int long long
using namespace std;
int read(){
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';
		c=getchar();
	}
	return s*w;
}
void print(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10)print(x/10);
	putchar(x%10+'0');
	return;
}
int n,m;
struct Node{
    int l,r,n,cnt;
}t[5000010];
int ncnt;
int root[200010];
int a[200010],b[200010];
int clone(int p){
    t[++ncnt]=t[p];
    t[ncnt].cnt++;
    return ncnt;
}
int build(int p,int l,int r){
    p=++ncnt;
    if(l==r)return p;
    int mid=(l+r)/2;
    t[p].l=build(t[p].l,l,mid);
    t[p].r=build(t[p].r,mid+1,r);
    return p;
}
int modify(int p,int l,int r,int x){
    p=clone(p);
    if(l==r)return p;
    int mid=(l+r)/2;
    if(x<=mid)t[p].l=modify(t[p].l,l,mid,x);
    else t[p].r=modify(t[p].r,mid+1,r,x);
    return p;
}
int ask(int L,int R,int l,int r,int rk){
    int mid=(l+r)/2,nrk=t[t[R].l].cnt-t[t[L].l].cnt;
    if(l==r)return l;
    if(nrk>=rk)return ask(t[L].l,t[R].l,l,mid,rk);
    else return ask(t[L].r,t[R].r,mid+1,r,rk-nrk);
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read(),m=read();
    for(int i=1;i<=n;i++){
        a[i]=b[i]=read();
    }
    sort(a+1,a+1+n);
    int size=unique(a+1,a+1+n)-a-1;
    root[0]=build(root[0],1,size);
    for(int i=1;i<=size;i++){
        int ls=lower_bound(a+1,a+1+size,b[i])-a;
        root[i]=modify(root[i-1],1,size,ls);
    }
    for(int i=1;i<=m;i++){
        int l=read(),r=read(),k=read();
        print(b[ask(root[l-1],root[r],1,size,k)]);
        putchar('\n');
    }
	return 0;
}

2023/4/27 20:46
加载中...