제출 #1278752

#제출 시각아이디문제언어결과실행 시간메모리
1278752iamhereforfunIndex (COCI21_index)C++20
110 / 110
1189 ms147680 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

using namespace std;

#define LSOne(X) ((X) & -(X))

const int N = 2e5 + 5;
const int M = 1e7 + 5;
const int LG = 31;
const int C = 26;
const int INF = 1e9 + 5;

struct PersistentSegmentTree
{
    struct Node
    {
        int val;
        Node *le, *ri;
        Node(Node *a, Node *b)
        {
            val = a->val + b->val;
            le = a;
            ri = b;
        }
        Node(Node *a)
        {
            val = a->val;
            le = a->le;
            ri = a->ri;
        }
        Node(int i)
        {
            val = i;
            le = ri = NULL;
        }
    } *root[N];
    int n, cid;
    Node *build(int l, int r)
    {
        if (l == r)
        {
            return new Node(1LL);
        }
        else
        {
            int m = (l + r) / 2;
            return new Node(build(l, m), build(m + 1, r));
        }
    }
    Node *update(Node *cur, int v, int p, int l, int r)
    {
        if (l == r)
        {
            return new Node(v);
        }
        else
        {
            int m = (l + r) / 2;
            if (p <= m)
            {
                return new Node(update(cur->le, v, p, l, m), cur->ri);
            }
            else
            {
                return new Node(cur->le, update(cur->ri, v, p, m + 1, r));
            }
        }
    }
    int get(Node *cur, int l, int r, int tl, int tr)
    {
        if (tl > tr)
            return 0;
        if (tl <= l && r <= tr)
        {
            return cur->val;
        }
        else
        {
            int m = (l + r) / 2;
            return get(cur->le, l, m, tl, min(tr, m)) + get(cur->ri, m + 1, r, max(tl, m + 1), tr);
        }
    }
    void build(int len)
    {
        n = len;
        root[0] = build(0, n - 1);
        cid = 1;
    }
    void update(int v, int p, int i)
    {
        root[i] = update(root[i], v, p, 0, n - 1);
    }
    int get(int l, int r, int i)
    {
        if (l > r)
            swap(l, r);
        return get(root[i], 0, n - 1, l, r);
    }
    void add(int i)
    {
        root[cid++] = new Node(root[i]);
    }
};

int n, q;
vector<int> val[N];

void solve()
{
    cin >> n >> q;
    for (int x = 0; x < n; x++)
    {
        int i;
        cin >> i;
        val[i].push_back(x);
    }
    PersistentSegmentTree pst;
    pst.build(n);
    for (int x = 1; x < N; x++)
    {
        pst.add(x - 1);
        for (int i : val[x - 1])
        {
            pst.update(0, i, x);
        }
    }
    for (int x = 0; x < q; x++)
    {
        int l, r;
        cin >> l >> r;
        l--;
        r--;
        int le = 0, ri = n, ans = 0;
        while (le <= ri)
        {
            int m = (le + ri) / 2;
            if (pst.get(l, r, m) >= m)
            {
                ans = m;
                le = m + 1;
            }
            else
            {
                ri = m - 1;
            }
        }
        cout << ans << "\n";
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...