Submission #1278752

#TimeUsernameProblemLanguageResultExecution timeMemory
1278752iamhereforfunIndex (COCI21_index)C++20
110 / 110
1189 ms147680 KiB
// Starcraft 2 enjoyer // #include <bits/stdc++.h> using namespace std; #define LSOne(X) ((X) & -(X)) const int N = 2e5 + 5; const int M = 1e7 + 5; const int LG = 31; const int C = 26; const int INF = 1e9 + 5; struct PersistentSegmentTree { struct Node { int val; Node *le, *ri; Node(Node *a, Node *b) { val = a->val + b->val; le = a; ri = b; } Node(Node *a) { val = a->val; le = a->le; ri = a->ri; } Node(int i) { val = i; le = ri = NULL; } } *root[N]; int n, cid; Node *build(int l, int r) { if (l == r) { return new Node(1LL); } else { int m = (l + r) / 2; return new Node(build(l, m), build(m + 1, r)); } } Node *update(Node *cur, int v, int p, int l, int r) { if (l == r) { return new Node(v); } else { int m = (l + r) / 2; if (p <= m) { return new Node(update(cur->le, v, p, l, m), cur->ri); } else { return new Node(cur->le, update(cur->ri, v, p, m + 1, r)); } } } int get(Node *cur, int l, int r, int tl, int tr) { if (tl > tr) return 0; if (tl <= l && r <= tr) { return cur->val; } else { int m = (l + r) / 2; return get(cur->le, l, m, tl, min(tr, m)) + get(cur->ri, m + 1, r, max(tl, m + 1), tr); } } void build(int len) { n = len; root[0] = build(0, n - 1); cid = 1; } void update(int v, int p, int i) { root[i] = update(root[i], v, p, 0, n - 1); } int get(int l, int r, int i) { if (l > r) swap(l, r); return get(root[i], 0, n - 1, l, r); } void add(int i) { root[cid++] = new Node(root[i]); } }; int n, q; vector<int> val[N]; void solve() { cin >> n >> q; for (int x = 0; x < n; x++) { int i; cin >> i; val[i].push_back(x); } PersistentSegmentTree pst; pst.build(n); for (int x = 1; x < N; x++) { pst.add(x - 1); for (int i : val[x - 1]) { pst.update(0, i, x); } } for (int x = 0; x < q; x++) { int l, r; cin >> l >> r; l--; r--; int le = 0, ri = n, ans = 0; while (le <= ri) { int m = (le + ri) / 2; if (pst.get(l, r, m) >= m) { ans = m; le = m + 1; } else { ri = m - 1; } } cout << ans << "\n"; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; for (int x = 1; x <= t; x++) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...