20pts AC on#1#2求调
查看原帖
20pts AC on#1#2求调
1109707
godmoo楼主2024/7/9 20:38

rt.

#include<bits/stdc++.h>
#define pb push_back
#define is insert
#define fi first
#define se second
#define bg begin
#define INF INT_MAX
#define Mod(a,m) (((a)%(m)+(m))%(m))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=2e5+5;
const int V=2e7+5;
int n,m,a[N],tmp[N];
int tot,rt[N];
struct Node{int lc,rc,val;}tr[V];
void pushup(int u){tr[u].val=tr[tr[u].lc].val+tr[tr[u].rc].val;}
void build(int u,int l,int r){
	if(l==r) return;
	int mid=l+r>>1;
	build(tr[u].lc=++tot,l,mid);
	build(tr[u].rc=++tot,mid+1,r);
}
void add(int u,int lstu,int l,int r,int pos){
	if(l==r){tr[u].val++;return;}
	int mid=l+r>>1;
	tr[u]=tr[lstu];
	if(pos<=mid) add(tr[u].lc=++tot,tr[lstu].lc,l,mid,pos);
	else add(tr[u].rc=++tot,tr[lstu].rc,mid+1,r,pos);
	pushup(u);
}
int query(int ul,int ur,int l,int r,int k){
	if(l==r) return l;
	int mid=l+r>>1,cnt=tr[tr[ur].lc].val-tr[tr[ul].lc].val;
	if(k<=cnt) return query(tr[ul].lc,tr[ur].lc,l,mid,k);
	else return query(tr[ul].rc,tr[ur].rc,mid+1,r,k-cnt);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",a+i),tmp[i]=a[i];
	sort(tmp+1,tmp+n+1);
    int c=unique(tmp+1,tmp+n+1)-tmp-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(tmp+1,tmp+c+1,a[i])-tmp;
	build(rt[0]=++tot,1,c);
	for(int i=1;i<=n;i++) add(rt[i]=(++tot),rt[i-1],1,c,a[i]);
	for(int i=1,l,r,k;i<=m;i++){
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",tmp[query(rt[l-1],rt[r],1,c,k)+1]);
	}
	return 0;
}
2024/7/9 20:38
加载中...