제출 #1286037

#제출 시각아이디문제언어결과실행 시간메모리
1286037gustavomlIndex (COCI21_index)C++20
110 / 110
328 ms134356 KiB
#include <bits/stdc++.h>

using namespace std;

#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#define endl '\n'
#define f first
#define s second
#define pb push_back
#define int long long

typedef long long ll;
typedef pair<int,int> ii;

const int INF = 0x3f3f3f3f3f3f3f3fll;

const int MAX = 2e5 + 10;

struct Vertex {
    Vertex *l, *r;
    int sum;

    Vertex(int v) : l(nullptr), r(nullptr), sum(v) {}
    Vertex(Vertex *l, Vertex *r) : l(l), r(r), sum(0) {
        if(l) sum += l->sum;
        if(r) sum += r->sum;
    }
};

Vertex* build(int begin = 0, int end = MAX) {
    if(begin == end) return new Vertex(0);
    int m = (begin + end) >> 1;
    return new Vertex(build(begin, m), build(m + 1, end));
}

Vertex* update(Vertex* v, int index, int add, int begin = 0, int end = MAX) {
    if(begin == end) return new Vertex(v->sum + add);
    int m = (begin + end) >> 1;
    if(index <= m) return new Vertex(update(v->l, index, add, begin, m), v->r);
    else return new Vertex(v->l, update(v->r, index, add, m + 1, end));
}

int query(Vertex* vl, Vertex *vr, int suffix, int begin = 0, int end = MAX) {
    if(begin == end) return begin;
    int right = vr->r->sum - vl->r->sum + suffix;
    int m = (begin + end) >> 1;
    if(right > m) return query(vl->r, vr->r, suffix, m + 1, end);
    return query(vl->l, vr->l, right, begin, m);
}

int32_t main() { _
    int n, q; cin >> n >> q;
    vector<int> p(n);
    for(int & i : p) cin >> i;
    vector<Vertex*> roots;
    roots.push_back(build());
    for(int i = 0; i < n; i++) {
        roots.push_back(update(roots.back(), p[i], 1));
    }
    while(q--) {
        int l, r; cin >> l >> r;
        cout << query(roots[l-1], roots[r], 0) << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...