【玄关】最后两个测试点RE,其他WA
查看原帖
【玄关】最后两个测试点RE,其他WA
743014
_H17_楼主2024/9/8 18:15

输出似乎全是0

#include<bits/stdc++.h>
using namespace std;
constexpr int N=2e5+1,M=(N+1)*19+1,Mx=1e9;
struct SegmentTreeNode{
    int l,r,ls,rs,cnt;
    SegmentTreeNode(int l=0,int r=0,int ls=0,int rs=0,int cnt=0):l(l),r(r),ls(ls),rs(rs),cnt(cnt){}
}f[M];
int n,q,tot=0,root[N];
void pushup(int x){
    f[x].cnt=f[f[x].ls].cnt+f[f[x].rs].cnt,
    f[x].l=f[f[x].ls].l,f[x].r=f[f[x].rs].r;
    return;
}
void modify(int l,int r,int val,int&cur,int last){
    f[cur=(++tot)]=f[last];
    if(l==r){
        f[cur].l=l,f[cur].r=r,
        f[cur].cnt=f[last].cnt+1;
        return;
    }
    int mid=(l+r)>>1;
    if(val<=mid)
        modify(l,mid,val,f[cur].ls,f[last].ls);
    else
        modify(mid+1,r,val,f[cur].rs,f[last].rs);
    return pushup(cur);
}
int query(int k,int cur,int last){
    if(f[cur].l==f[cur].r)
        return f[cur].l;
    int cnt=f[f[cur].ls].cnt-f[f[last].ls].cnt;
    if(k<=cnt)
        return query(k,f[cur].ls,f[last].ls);
    else
        return query(k-cnt,f[cur].rs,f[last].rs);
}
int main(){
    cin>>n>>q;
    for(int i=1,k;i<=n;i++){
        cin>>k;
        modify(1,Mx,k,root[i],root[i-1]);
    }
    for(int l,r,k;q;--q){
        cin>>l>>r>>k;
        cout<<query(k,root[r],root[l-1])<<'\n';
    }
    return 0;
}
2024/9/8 18:15
加载中...