Submission #1189681

#TimeUsernameProblemLanguageResultExecution timeMemory
1189681gustavo_dIndex (COCI21_index)C++20
110 / 110
239 ms52856 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 200001; const int MAXNODES = MAXN * 200; int val[MAXN]; struct Node { int sum; Node(int _sum=0): sum(_sum) {} Node operator+(Node right) { Node left = *this; return Node(left.sum + right.sum); } }; struct SEG { int n; vector<Node> seg; vector<int> ls, rs; SEG(int _n=0) { n = 1; while (n < _n) n <<= 1; seg.reserve(MAXNODES); ls.reserve(MAXNODES); rs.reserve(MAXNODES); createNode(); createNode(); } int createNode(int src = 0) { seg.push_back(src == 0 ? Node() : seg[src]); ls.push_back(src == 0 ? 0 : ls[src]); rs.push_back(src == 0 ? 0 : rs[src]); return (int)seg.size() - 1; } int getLeft(int v) { return ls[v] = (ls[v] == 0 ? createNode() : ls[v]); } int getRight(int v) { return rs[v] = (rs[v] == 0 ? createNode() : rs[v]); } int add(int v, int l, int r, int i, int x) { v = createNode(v); if (l == r) { seg[v].sum += x; return v; } int m = (l + r) / 2; if (i <= m) ls[v] = add(getLeft(v), l, m, i, x); else rs[v] = add(getRight(v), m+1, r, i, x); seg[v] = seg[getLeft(v)] + seg[getRight(v)]; return v; } int findH(int vl, int vr, int l, int r, int bigger) { if (l == r) return l; int m = (l + r) / 2; int right = seg[getRight(vr)].sum - seg[getRight(vl)].sum; // cout << l << ' ' << r << ' ' << bigger << ' ' << right << endl; if (m+1 <= bigger + right) return findH(getRight(vl), getRight(vr), m+1, r, bigger); else return findH(getLeft(vl), getLeft(vr), l, m, bigger + right); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, qs; cin >> n >> qs; for (int i=1; i<=n; i++) cin >> val[i]; SEG seg(MAXN); vector<int> versions{1}; for (int i=1; i<=n; i++) { versions.push_back(seg.add(versions.back(), 0, seg.n-1, val[i], 1)); } for (int q=0; q<qs; q++) { int l, r; cin >> l >> r; cout << seg.findH(versions[l-1], versions[r], 0, seg.n-1, 0) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...