Submission #1300409

#TimeUsernameProblemLanguageResultExecution timeMemory
1300409ghostlywalrusIndex (COCI21_index)C++20
110 / 110
352 ms98740 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #define int long long #define PI pair<int,int> #define f first #define s second #define pb push_back #define szo(x) ((int)x.size()) const int MAX = 2e7; int seg[MAX]; int L[MAX], R[MAX]; int nodes = 1; const int LIM = 2e5+10; void build(int x = 1, int l = 0, int r = LIM){ if (l == r) return; int tm = (l+r)/2; L[x] = nodes++, R[x] = nodes++; build(L[x], l, tm); build(R[x], tm+1, r); } int update(int id, int val, int x, int xo, int l = 0, int r = LIM){ if (l == r) return seg[x] = seg[xo]+val; int tm = (l+r)/2; if (id <= tm) return seg[x] = update(id, val, L[x] = nodes++, L[xo], l, tm) + seg[R[x] = R[xo]]; return seg[x] = update(id, val, R[x] = nodes++, R[xo], tm+1, r) + seg[L[x] = L[xo]]; } int solve(int r1, int r2, int acc, int l = 0, int r = LIM){ if (l == r) return l; int tm = (l+r)/2; if (acc + seg[R[r1]] - seg[R[r2]] >= tm+1) return solve(R[r1], R[r2], acc, tm+1, r); return solve(L[r1], L[r2], acc+seg[R[r1]]-seg[R[r2]], l, tm); } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,q; cin >> n >> q; vector<int> vec(n+1); for (int i = 1; i <= n; ++i) cin >> vec[i]; build(); vector<int> rts(n+1); rts[0] = 0; for (int i = 1; i <= n; ++i){ rts[i] = nodes++; update(vec[i], 1, rts[i], rts[i-1]); } while (q--){ int l, r; cin >> l >> r; cout << solve(rts[r], rts[l-1], 0) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...