Submission #402572

#TimeUsernameProblemLanguageResultExecution timeMemory
402572Talha_TakiIndex (COCI21_index)C++17
110 / 110
1244 ms137276 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e5; struct Vertex { Vertex *l, *r; int cnt; Vertex(int val) : l(nullptr), r(nullptr), cnt(val) {} Vertex(Vertex* l, Vertex* r) : l(l), r(r), cnt(0) { if (l) cnt += l->cnt; if (r) cnt += r->cnt; } }; struct persistenSegmentTree { Vertex* build(int l, int r) { if (l == r) return new Vertex(0); int mid = (l+r)>>1; return new Vertex(build(l, mid), build(mid+1, r)); } Vertex* update(Vertex* v, int l, int r, const int val) { if (l == r) return new Vertex(v->cnt+1); int mid = (l+r)>>1; if (val <= mid) return new Vertex(update(v->l, l, mid, val), v->r); return new Vertex(v->l, update(v->r, mid+1, r, val)); } int query(Vertex* v1, Vertex* v2, int l, int r, const int k) { if (l == r) return (k <= l? v2->cnt - v1->cnt:0); int mid = (l+r)>>1; if (k <= mid) return (v2->r->cnt - v1->r->cnt) + query(v1->l, v2->l, l, mid, k); return query(v1->r, v2->r, mid+1, r, k); } }; int main(int argc, const char* argv[]) { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector <int> arr(n+1); for(int i = 1; i <= n; ++i) { cin >> arr[i]; } persistenSegmentTree tree; vector <Vertex*> version(n+1); version[0] = tree.build(1, MAXN); for(int i = 1; i <= n; ++i) { version[i] = tree.update(version[i-1], 1, MAXN, arr[i]); } while (q--) { int left, right; cin >> left >> right; int l = 1, r = MAXN; int best = 0; while (l <= r) { int mid = (l+r)>>1; int cnt = tree.query(version[left-1], version[right], 1, MAXN, mid); if (cnt >= mid) { best = mid; l = mid+1; } else r = mid-1; } cout << best << '\n'; } arr.clear(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...