Submission #942592

#TimeUsernameProblemLanguageResultExecution timeMemory
942592LOLOLOIndex (COCI21_index)C++17
110 / 110
1296 ms141448 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define f first #define s second #define pb push_back #define ep emplace #define eb emplace_back #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define uniquev(v) sort(all(v)), (v).resize(unique(all(v)) - (v).begin()) #define mem(f,x) memset(f , x , sizeof(f)) #define sz(x) (int)(x).size() #define __lcm(a, b) (1ll * ((a) / __gcd((a), (b))) * (b)) #define mxx *max_element #define mnn *min_element #define cntbit(x) __builtin_popcountll(x) #define len(x) (int)(x.length()) const int N = 1e6 + 100; const int lim = 2e5 + 100; struct node{ ll s = 0; node * l, *r; node() {}; node(node *L, node *R, ll v) { l = L; r = R; s = v; } }; node *seg[N]; void build(node *root, int l, int r) { if (l == r) { return; } int m = (l + r) / 2; root -> l = new node(NULL, NULL, 0); root -> r = new node(NULL, NULL, 0); build(root -> l, l, m); build(root -> r, m + 1, r); } void upd(node *pr, node *cur, int l, int r, int v) { if (l > v || r < v) return; if (l == r) { return; } int m = (l + r) / 2; if (v <= m) { cur -> r = pr -> r; cur -> l = new node(NULL, NULL, pr -> l -> s + 1); upd(pr -> l, cur -> l, l, m, v); } else { cur -> l = pr -> l; cur -> r = new node(NULL, NULL, pr -> r -> s + 1); upd(pr -> r, cur -> r, m + 1, r, v); } } ll get(node *root, int l, int r, int u, int v) { if (l > v || r < u) return 0; if (l >= u && r <= v) { return root -> s; } int m = (l + r) / 2; return get(root -> l, l, m, u, v) + get(root -> r, m + 1, r, u, v); } ll a[N]; ll solve() { int n, q; cin >> n >> q; seg[0] = new node(NULL, NULL, 0); build(seg[0], 1, lim); for (int i = 1; i <= n; i++) { cin >> a[i]; seg[i] = new node(NULL, NULL, seg[i - 1] -> s + 1); upd(seg[i - 1], seg[i], 1, lim, a[i]); } while (q--) { int u, v; cin >> u >> v; int l = 1, r = lim, ans = 0; while (l <= r) { int m = (l + r) / 2; if (get(seg[v], 1, lim, m, lim) - get(seg[u - 1], 1, lim, m, lim) >= m) { ans = m; l = m + 1; } else { r = m - 1; } } cout << ans << '\n'; } return 0; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t = 1; //cin >> t; while (t--) { solve(); //cout << solve() << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...