社区讨论

样例不过求调

P3834【模板】可持久化线段树 2参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo2b71sr
此快照首次捕获于
2023/10/23 10:59
2 年前
此快照最后确认于
2023/11/03 11:09
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
const int N=2e5+10;
struct node{int l,r,v;};
int n,m,q,cnt,a[N],b[N],rt[N];
node tr[N<<5];
inline int build(int pre,int l,int r,int x) {
    int p=++cnt;
    tr[p]={tr[pre].l,tr[pre].r,tr[pre].v+1};
    if(l<r) {
        if(x<=mid) tr[p].l=build(tr[pre].l,l,mid,x);
        else tr[p].r=build(tr[pre].r,mid+1,r,x);
    }
    return p;
}
inline int query(int L,int R,int l,int r,int k) {
    if(l==r) return l;
    int x=tr[tr[L].l].v-tr[tr[R].l].v;
    if(x>=k) return query(tr[L].l,tr[R].l,l,mid,k);
    else return query(tr[L].r,tr[R].r,mid+1,r,k-x);
}
signed main() {
    ios::sync_with_stdio(NULL);
    cin>>n>>q,m=n;
    for(int i=1;i<=n;++i) cin>>a[i],b[i]=a[i];
    sort(b+1,b+1+m),m=unique(b+1,b+1+m)-b-1;
    for(int i=1;i<=n;++i) {
        int x=lower_bound(b+1,b+1+m,a[i])-b;
        rt[i]=build(rt[i-1],1,m,x);
    }
    while(m--) {
        int l,r,k;
        cin>>l>>r>>k;
        cout<<b[query(rt[l-1],rt[r],1,m,k)]<<endl;
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...