제출 #1279015

#제출 시각아이디문제언어결과실행 시간메모리
1279015MvKaioIndex (COCI21_index)C++20
110 / 110
298 ms101960 KiB
#include <bits/stdc++.h>
using namespace std;

#define int ll
#define fast_io cin.tie(0)->sync_with_stdio(0);
#define endl '\n'
typedef long long ll;

namespace perseg {
    const int MAX = 2e6 + 10;
    int n, seg[20 * MAX], l[20 * MAX], r[20 * MAX], at = 1, root;
    int node(int cp=0) {
        seg[at] = seg[cp], l[at] = l[cp], r[at] = r[cp];
        return at++;
    }
    void build(int x, int lx, int rx) {
        if (lx + 1 == rx) return;
        int mid = (lx + rx) / 2;
        build(l[x] = node(), lx, mid);
        build(r[x] = node(), mid, rx);
    }
    void build(int _n) {
        n = _n;
        build(root = node(), 0, n);
    }
    void update(int i, int v, int x, int lx, int rx) {
        if (lx + 1 == rx) {
            seg[x] += v;
            return;
        }
        int mid = (lx + rx) / 2;
        if (i < mid) update(i, v, l[x] = node(l[x]), lx, mid);
        else update(i, v, r[x] = node(r[x]), mid, rx);
        seg[x] = seg[l[x]] + seg[r[x]];
    }
    int update(int i, int v) {
        update(i, v, root = node(root), 0, n);
        return root;
    }
    int solve(int r1, int r2, int cur=0, int lx=0, int rx=n) {
        if (lx + 1 == rx) return lx;
        int mid = (lx + rx) / 2;
        int cntr = seg[r[r2]] - seg[r[r1]];
        if (cur + cntr < mid) return solve(l[r1], l[r2], cur+cntr, lx, mid);
        else return solve(r[r1], r[r2], cur, mid, rx);
    }
}

int32_t main() {
    fast_io;

    int n, q; cin >> n >> q;
    vector<int> a(n);
    for (auto &x : a) cin >> x;

    vector<int> roots(n + 1);
    const int MAX = *max_element(a.begin(), a.end());
    perseg::build(MAX + 1);
    roots[0] = perseg::root;
    for (int i = 0; i < n; i++) roots[i + 1] = perseg::update(a[i], 1);

    while (q--) {
        int l, r; cin >> l >> r;
        cout << perseg::solve(roots[l - 1], roots[r]) << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...