记录编号 600110 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 Gravatar会挽弯弓满月 是否通过 通过
代码语言 C++ 运行时间 2.459 s
提交时间 2025-04-15 21:33:24 内存使用 23.03 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,m,cnt,tot;
int a[N],b[N];
struct node{
    int sum,l,r;
}t[N<<5];
int root[N];
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    return f*x;
}
void build(int &p,int l1,int r1){
    cnt++;
    p=cnt;
    if(l1==r1) return;
    int mid=(l1+r1)>>1;
    build(t[p].l,l1,mid);
    build(t[p].r,mid+1,r1);
    return;
}
void update(int p,int &now,int l1,int r1,int x){
    cnt++;
    now=cnt;
    t[now]=t[p];
    t[now].sum++;
    if(l1==r1) return;
    int mid=(l1+r1)>>1;
    if(x<=mid) update(t[p].l,t[now].l,l1,mid,x);
    else update(t[p].r,t[now].r,mid+1,r1,x);
    return;
}
int query(int p,int x,int l1,int r1,int k){
    if(l1==r1) return b[l1];
    int mid=(l1+r1)>>1;
    int ans=t[t[x].l].sum-t[t[p].l].sum;
    if(k<=ans) return query(t[p].l,t[x].l,l1,mid,k);
    else return query(t[p].r,t[x].r,mid+1,r1,k-ans);
}
int main(){
	freopen("kthnumber.in","r",stdin);
	freopen("kthnumber.out","w",stdout);
    n=read();m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    tot=unique(b+1,b+n+1)-b-1;
    build(root[0],1,tot);
    for(int i=1;i<=n;i++){
        int x=lower_bound(b+1,b+tot+1,a[i])-b;
        update(root[i-1],root[i],1,tot,x);
    }
    int l,r,k,ans;
    for(int i=1;i<=m;i++){
        l=read();r=read();k=read();
        ans=query(root[l-1],root[r],1,tot,k);
        printf("%d\n",ans);
    }
    return 0;
}