Submission #1123443

#TimeUsernameProblemLanguageResultExecution timeMemory
1123443qrnIndex (COCI21_index)C++20
60 / 110
2593 ms64920 KiB
#include <bits/stdc++.h>
using namespace std;

template <class IStr, class T>
IStr &operator>>(IStr &is, vector<T> &v) {
    for (auto &x : v)
        is >> x;
    return is;
}

#define printt(a)          \
    for (auto v : a)      \
    {                     \
        cout << v << " "; \
    }                     \
    cout << endl;

#define SPEED                     \
    ios_base::sync_with_stdio(0); \
    cin.tie(NULL);                \
    cout.tie(NULL);

#define pb push_back
// #define endl "\n"
#define ALL(x) x.begin(), x.end()
#define intt long long
#define ins insert
#define vi vector<intt>
#define vpii vector<pair<intt, intt>>
#define vvi vector<vi>
#define pii pair<intt, intt>
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define impos cout << -1 << endl
#define fi first
#define se second

const int inf = 1e9 + 7, mxN = 2e5 + 5;

vector<vector<intt>>seg(4 * mxN);
vector<intt> a(mxN);

void merge(intt node) {
    for(intt i : seg[node*2]) {
        seg[node].pb(i);
    }
    for(intt i : seg[node*2+1]) {
        seg[node].pb(i);
    }
    sort(ALL(seg[node]));
}

void build(intt node, intt l, intt r) {
    if(l == r) {
        seg[node].pb(a[l]);
        return;
    }
    intt mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    merge(node);
}

intt ask(intt node, intt l, intt r, intt ql, intt qr, intt x) {
    if(ql > r || qr < l) {
       return 0;
    }
    
    if(ql <= l && r <= qr) {
        // if(ql == 5 && qr == 7){
        //     for(auto i : seg[node]) cout << i << " ";
        //     cout << "QOZ: " << l << " " << r << endl;
        //     cout << "POX: " << (lower_bound(ALL(seg[node]), x) - seg[node].begin()) << endl;
        // }
        return (r - l + 1) - (lower_bound(ALL(seg[node]), x) - seg[node].begin());
    }
    
    intt mid = (l + r) / 2;
    return (ask(node * 2, l, mid, ql, qr, x) +  ask(node * 2 + 1, mid + 1, r, ql, qr, x));
}

void solve() {
    intt n, q;
    cin >> n >> q;
    for(intt i = 1; i <= n; i++) cin >> a[i];
    
    build(1, 1, n);
      
    while(q--) {
        intt a, b;
        cin >> a >> b;
        intt l = 0, r = inf, ans = 0;
        while(l <= r) {
            intt mid = (l + r) / 2;
            intt cnt = ask(1, 1, n, a, b, mid);
            // if(a == 5 && b == 7)
            // cout << l << " " << r << " " << cnt << " " << mid << endl;
            if(cnt >= mid) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        cout << ans << endl;
    }
}


int main() {
    SPEED;
    intt tst = 1;
    // cin >> tst;
    while (tst--) {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...