3834求调求求大佬了
  • 板块题目总版
  • 楼主zznomortypig
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/9 23:23
  • 上次更新2024/10/10 14:02:29
查看原帖
3834求调求求大佬了
1310634
zznomortypig楼主2024/10/9 23:23
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mx=5e7+5;
struct node
{
    int val;
    int l;int r;
}w[mx];
int a[mx],cnt,h[mx];
vector<int>c;
void build(int u,int l,int r)
{
    if(l==r)
    return ;
    w[u].l=++cnt;
    w[u].r=++cnt;
    int mid=(l+r)/2;
    build(w[u].l,l,mid);
    build(w[u].r,mid+1,r);
}
void insert(int u,int last,int l,int r,int k)
{
    if(l==r&&l==k)
    {
        w[u].val++;
        return ;
    }
    int mid=(l+r)/2;
    w[u].l=w[last].l;
    w[u].r=w[last].r;
    if(k<=mid)
    {
        w[u].l=++cnt;
        insert(cnt,w[last].l,l,mid,k);
    }
    else
    {
        w[u].r=++cnt;
        insert(cnt,w[last].r,mid+1,r,k);
    }
    w[u].val=w[w[u].l].val+w[w[u].r].val;
}
int inq(int last,int u,int l,int r,int k)
{
    if(l>=r) return l;
    int mid=(l+r)/2;
    int vl=w[w[u].l].val-w[w[last].l].val;
    if(vl<k)
        return inq(w[last].r,w[u].r,mid+1,r,k-vl);
    else
        return inq(w[last].l,w[u].l,l,mid,k);
}
signed main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {    cin>>a[i];
        c.push_back(a[i]);
    }
    sort(c.begin(),c.end());
    c.erase(unique(c.begin(),c.end()),c.end());
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(c.begin(),c.end(),a[i])-c.begin()+1;
       h[0]=cnt=1;
       int nn=c.size();
    build(1,1,nn);
    for(int i=1;i<=n;i++)
    {   
        h[i]=++cnt;
        insert(h[i],h[i-1],1,nn,a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int l,r,k;
        cin>>l>>r>>k;
        cout<<c[inq(h[l-1],h[r],1,nn,k)-1]<<endl;
    }
    return 0;
}
2024/10/9 23:23
加载中...