Submission #1340290

#TimeUsernameProblemLanguageResultExecution timeMemory
1340290fgggIndex (COCI21_index)C++20
110 / 110
1091 ms103640 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")
using namespace std;
using ll = long long;
using ld = long double;
struct nd {
    ll s, l, r;  
};
vector<nd> t = {{0, -1, -1}};
void bld(ll v, ll l, ll r) {
    if (l + 1 == r) {
        t[v] = {0, -1, -1};
        return;
    }
    ll md = (l + r) >> 1;
    t.push_back({0, -1, -1});
    t[v].l = t.size() - 1;
    t.push_back({0, -1, -1});
    t[v].r = t.size() - 1;
    bld(t[v].l, l, md);
    bld(t[v].r, md, r);
}
ll upd(ll v, ll l, ll r, ll i, ll x) {
    //cout << v << ' ' << l << ' ' << r << endl;
    ll nv = t.size();
    t.push_back(t[v]);
    if (l + 1 == r) {
        t[nv] = {x, -1, -1};
        return nv;
    }
    ll md = (l + r) >> 1;
    if (i < md) t[nv].l = upd(t[v].l, l, md, i, x);
    else t[nv].r = upd(t[v].r, md, r, i, x);
    t[nv].s = t[t[nv].l].s + t[t[nv].r].s;
    return nv;
}
ll get(ll v, ll l, ll r, ll ql, ll qr) {
    if (l >= qr || ql >= r) return 0;
    if (l >= ql && r <= qr) return t[v].s;
    ll md = (l + r) >> 1;
    return get(t[v].l, l, md, ql, qr) + get(t[v].r, md, r, ql, qr);
}
void solve() {
    ll n, q;
    cin >> n >> q;
    vector<pair<ll, ll>> a(n);
    for (ll i = 0; i < n; i++) cin >> a[i].first, a[i].second = i;
    bld(0, 0, n);
    vector<ll> pr(2e5 + 52);
    sort(a.begin(), a.end());
    ll last = 0;
    for (ll i = n - 1; i > -1; i--) {
        //cout << last << ' ' << a[i].second << endl;
        ll cr = upd(last, 0, n, a[i].second, 1);
        pr[a[i].first] = cr;
        //cout << a[i].first << ' ' << cr << endl;
        last = cr;
    }
    while (q--) {
        ll l, r;
        cin >> l >> r;
        l--, r--;
        ll lb = 1, rb = 2e5 + 1;
        while (rb - lb > 1) {
            ll md = (lb + rb) >> 1;
            ll j = lower_bound(a.begin(), a.end(), make_pair(md, (ll)-1e18)) - a.begin();
            if (j < a.size() && get(pr[a[j].first], 0, n, l, r + 1) >= md) lb = md;
            else rb = md;
        }
        cout << lb << '\n';
    }
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...