Submission #1135440

#TimeUsernameProblemLanguageResultExecution timeMemory
1135440DangKhoizzzzIndex (COCI21_index)C++20
110 / 110
2037 ms19100 KiB
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair <int , int>
#define ar3 array <int , 3>

using namespace std;

const int INF = 1e9 + 7;
const int maxn = 2e5 + 7;

int n , q , a[maxn];
vector <int> bit[maxn];

void update(int id , int val)
{
    int idx = id;
    while(idx <= n)
    {
        bit[idx].push_back(val);
        idx += (idx & (-idx));
    }
}

int getp(int p , int val)
{
    int idx = p;
    int res = 0;

    while(idx > 0)
    {
        res += (int)(lower_bound(bit[idx].begin() , bit[idx].end() , val) - bit[idx].begin());
        idx -= (idx & (-idx));
    }
    return res;
}

int get_ask(int l , int r , int val)
{
    return (r - l + 1) - (getp(r , val) - getp(l-1 , val));
}


void solve()
{
    cin >> n >> q;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) update(i , a[i]);

    for(int i = 1; i <= n; i++)
    {
        sort(bit[i].begin() , bit[i].end());
    }

    while(q--)
    {
        int L , R , H = -1; cin >> L >> R;
        int l = 1 , r = (R - L + 1);
        while(l <= r)
        {
            int mid = (l + r)/2;
            if(get_ask(L , R , mid) >= mid)
            {
                H = mid;
                l = mid + 1;
            }
            else r = mid - 1;
        }
        cout << H << '\n';
    }
}

int 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...