제출 #1299475

#제출 시각아이디문제언어결과실행 시간메모리
1299475DangKhoizzzzIndex (COCI21_index)C++20
110 / 110
1078 ms133500 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair <int , int>
#define arr3 array <int , 3>

using namespace std;
const int maxn = 2e5 + 7;

int n;
struct PST
{
    struct node
    {
        int sum;
        node *l_child; node *r_child;
        node(node *x)
        {
            sum = x->sum;
            l_child = x->l_child;
            r_child = x->r_child;
        }
        node(int x)
        {
            sum = x;
            l_child = r_child = NULL;
        }
        node(node *lnode , node *rnode)
        {
            sum = lnode->sum + rnode->sum;
            l_child = lnode;
            r_child = rnode;
        }
    } *root[maxn];

    node *build(int l , int r)
    {
        if(l == r) return new node(0);
        int mid = (l+r)>>1;
        return new node(node(build(l , mid) , build(mid+1 , r)));
    }
    node *update(node *id , int l , int r , int pos , int val)
    {
        if(l == r)
        {
            node *cur = new node(id);
            cur->sum += val;
            return cur;
        }
        int mid = (l+r)>>1;
        if(pos <= mid)
        {
            return new node(update(id->l_child , l , mid , pos , val) , id->r_child);
        }
        else
        {
            return new node(id->l_child , update(id->r_child , mid+1 , r , pos , val));
        }
    }
    int get(node *id , int l , int r , int u , int v)
    {
        if(r < u || l > v) return 0;
        if(u <= l && r <= v) return id->sum;
        int mid = (l+r)>>1;
        return get(id->l_child , l , mid , u , v) + get(id->r_child , mid+1 , r , u , v);
    }
    void add(int event)
    {
        root[event] = root[event-1];
    }
    void upd(int event , int pos , int val)
    {
        root[event] = update(root[event] , 1 , n , pos , val);
    }
    int gt(int event , int l , int r)
    {
        return get(root[event] , 1 , n , l , r);
    }
} pst;

int p[maxn] , q;

void solve()
{
    cin >> n >> q;
    pst.root[0] = pst.build(1 , n);
    for(int i = 1; i <= n; i++)
    {
        cin >> p[i];
        pst.add(i);
        pst.upd(i , p[i] , 1);
    }
    while(q--)
    {
        int l , r; cin >> l >> r;
        int lo = 1 , hi = (r - l + 1) , ans = 1;
        while(lo <= hi)
        {
            int mid = (lo + hi)>>1;
            int chk = pst.gt(r , mid , n) - pst.gt(l-1 , mid , n);
            if(chk >= mid)
            {
                ans = mid;
                lo = mid + 1;
            }
            else hi = mid - 1;
        }
        cout << ans << '\n';
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...