Submission #476211

#TimeUsernameProblemLanguageResultExecution timeMemory
476211ShinIndex (COCI21_index)C++14
110 / 110
579 ms136368 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define TASK "task"
#define all(x) x.begin(), x.end()

using namespace std;
const int N = 2e5 + 7;
const int MOD = 1e9 + 7; // 998244353;
const int INF = 1e9 + 7;
const long long INFLL = 1e18 + 7;

typedef long long ll;
typedef unsigned long long ull;
template <class X, class Y> bool minimize(X &a, Y b) {
    if (a > b) return a = b, true;
    return false;
}
template <class X, class Y> bool maximize(X &a, Y b) {
    if (a < b) return a = b, true;
    return false;
}

struct Node {
    int val;
    Node *l = NULL, *r = NULL;

    Node(int _val = 0) : val(_val) {};
    Node(Node *ll, Node *rr) : l(ll), r(rr) {
        val = (l ? l->val : 0) + (r ? r->val : 0);
    }
};

struct P_IT {
    vector<Node*> root;
    int n;

    P_IT(int _n = 0) : n(_n) {
        root.push_back(build(1, n));
    }
    
    Node* build(int l, int r) {
        if (l == r) return new Node();
        int mid = (l + r) >> 1;
        return new Node(build(l, mid), build(mid + 1, r));
    }

    Node* update(Node* node, int pos, int val, int l, int r) {
        if (l == r) return new Node(node->val + val);
        int mid = (l + r) >> 1;
        if (mid < pos) return new Node(node->l, update(node->r, pos, val, mid + 1, r));
        return new Node (update(node->l, pos, val, l, mid), node->r);
    }

    int get(Node* ll, Node* rr, int sum, int l, int r) {
        if (l == r) return l;
        int mid = (l + r) >> 1, delta = rr->r->val - ll->r->val;
        if (mid >= delta + sum) return get(ll->l, rr->l, sum + delta, l, mid);
        return get(ll->r, rr->r, sum, mid + 1, r);
    }

    void update(int pos, int val) {
        root.push_back(update(root.back(), pos, val, 1, n));
    }

    int query(int l, int r) {
        return get(root[l - 1], root[r], 0, 1, n);
    }
};

void solve(void) { 
    int n, q; cin >> n >> q;
    P_IT st(N);
    for (int i = 1; i <= n; i ++) {
        int x; cin >> x;
        st.update(x, 1);
    }

    while (q --) {
        int l, r; cin >> l >> r;
        cout << st.query(l, r) << '\n';
    }
} 

int main(void) {
    cin.tie(0)->sync_with_stdio(0); 
    int test = 1;
    // cin >> test;
    while (test --) {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...