目录
- 生成机制
【参考实现】
- @ 2026-3-15 11:52:16
#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;
}
0 条评论
目前还没有评论...
京公网安备11010802045784号
YIZHIYANG 一只羊 LV 8
生成机制
信息