目录
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAX = 500005;
int n, m;
int a[MAX];
int c[MAX];
vector<int> ad[MAX];
ll tot[MAX];
int q;
ll ans[MAX];

struct QRY {
    ll r;
    int id;
};
vector<QRY> qs[MAX];

int f[MAX];

void upd(int i, int v) {
    for(; i <= m; i += i & -i) f[i] += v;
}

int kth(int k) {
    int p = 0;
    for(int i = 19; i >= 0; --i) {
        if(p + (1 << i) <= m && f[p + (1 << i)] < k) {
            p += (1 << i);
            k -= f[p];
        }
    }
    return p + 1;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) {
        cin >> a[i];
        c[a[i]]++;
    }
    int mc = 0;
    for(int i = 1; i <= m; ++i) {
        ad[c[i]].push_back(i);
        if(c[i] > mc) mc = c[i];
    }
    ll act = 0;
    for(int i = 0; i <= mc; ++i) {
        act += ad[i].size();
        tot[i + 1] = tot[i] + act;
    }
    cin >> q;
    for(int i = 1; i <= q; ++i) {
        ll x;
        cin >> x;
        if(x <= n) {
            ans[i] = a[x];
        } else {
            ll xp = x - n;
            if(xp > tot[mc]) {
                ll xpp = xp - tot[mc] - 1;
                ans[i] = xpp % m + 1;
            } else {
                int k = lower_bound(tot + 1, tot + mc + 1, xp) - tot - 1;
                ll r = xp - tot[k];
                qs[k].push_back({r, i});
            }
        }
    }
    for(int i = 0; i <= mc; ++i) {
        for(int v : ad[i]) upd(v, 1);
        for(auto qy : qs[i]) {
            ans[qy.id] = kth(qy.r);
        }
    }
    for(int i = 1; i <= q; ++i) cout << ans[i] << "\n";
    return 0;
}

信息

ID
416
时间
1000ms
内存
256MiB
难度
10
标签
递交数
5
已通过
1
上传者

0 条评论

目前还没有评论...