链接:https://ac.nowcoder.com/acm/contest/1107/C 来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K Special Judge, 64bit IO Format: %lld
The h-index of an author is the largest h where he has at least h papers with citations not less than h. Bobo has published n papers with citations a1,a2,…,ana_1, a_2, \dots, a_na1,a2,…,an respectively. One day, he raises q questions. The i-th question is described by two integers lil_ili and rir_iri, asking the h-index of Bobo if has *only* published papers with citations ali,ali+1,…,aria_{l_i}, a_{l_i + 1}, \dots, a_{r_i}ali,ali+1,…,ari.
示例1
复制
5 3 1 5 3 2 1 1 3 2 4 1 5 5 1 1 2 3 4 5 1 5复制
2 2 2 3#include<bits/stdc++.h> using namespace std; const int MAXN = 150010; const int M = MAXN * 30; int tot, a[MAXN]; int T[M], lson[M], rson[M], c[M]; int build(int l, int r) { int root = tot++; c[root] = 0; if (l != r) { int mid = (l + r) >> 1; lson[root] = build(l, mid); rson[root] = build(mid + 1, r); } return root; } int update(int root, int pos, int val, int m) { int newroot = tot++, tmp = newroot; c[newroot] = c[root] + val; int l = 1, r = m; while (l < r) { int mid = (l + r) >> 1; if (pos <= mid) { lson[newroot] = tot++; rson[newroot] = rson[root]; newroot = lson[newroot]; root = lson[root]; r = mid; } else { rson[newroot] = tot++; lson[newroot] = lson[root]; newroot = rson[newroot]; root = rson[root]; l = mid + 1; } c[newroot] = c[root] + val; } return tmp; } int query(int left_root, int right_root, int l, int r, int w) { //cout << c[left_root] << " " << c[right_root] << " " << l << " " << r << " " << w << "\n"; if (l == r) { return l; } int mid = (l + r) >> 1; if (c[rson[right_root]] - c[rson[left_root]] + w >= mid + 1) { return query(rson[left_root], rson[right_root], mid + 1, r, w); } else { return query(lson[left_root], lson[right_root], l, mid, w + c[rson[right_root]] - c[rson[left_root]]); } } const int K = 100005; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; while (cin >> n >> m) { tot = 0; T[0] = build(1, K); for (int i = 1; i <= n; i++) { cin >> a[i]; T[i] = update(T[i - 1], a[i], 1, K); } while (m--) { int a, b; cin >> a >> b; cout << query(T[a - 1], T[b], 1, K, 0) << "\n"; } } return 0; }