Submission #397627

#TimeUsernameProblemLanguageResultExecution timeMemory
397627MrRobot_28Index (COCI21_index)C++17
110 / 110
300 ms9924 KiB
#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define sz(a) (int)a.size()
const int mod = 1e9 + 7;
const int N = 2e5+ 100;
int cnt[N];
const int T = 500;
bool cmp(pair <pair <int, int>, int> a, pair <pair <int, int>, int> b)
{
    if((a.X.X / T) == (b.X.X / T))
    {
        return a.X.Y < b.X.Y;
    }
    return (a.X.X / T) < (b.X.X / T);
}
int n, q;
int h[N];
signed main()
{
  //  ifstream cin("input1.txt.4c");
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> q;
    for(int i = 0; i < n; i++)
    {
        cin >> h[i];
    }
    vector <pair <pair <int, int>, int> > queries;
    for(int i = 0; i < q; i++)
    {
        int l, r;
        cin >> l >> r;
        l--;
        r--;
        queries.push_back({{l, r}, i});
    }
    sort(queries.begin(), queries.end(), cmp);
    int suma, it;
    vector <int> qans(q);
    for(int i = 0; i < sz(queries); i++)
    {
        int l = queries[i].X.X;
        int r = queries[i].X.Y;
        if(i == 0 || (queries[i].X.X / T) != (queries[i - 1].X.X / T))
        {
            fill(cnt, cnt + N, 0);
            suma = 0;
            it = 1;
            for(int j = l; j <= r; j++)
            {
                suma++;
                cnt[h[j]]++;
            }
        }
        else
        {
            for(int j = queries[i - 1].X.Y + 1; j <= r; j++)
            {
                if(h[j] >= it)
                {
                    suma++;
                }
                cnt[h[j]]++;
            }
            for(int j = queries[i].X.X; j < queries[i - 1].X.X; j++)
            {
                if(h[j] >= it)
                {
                    suma++;
                }
                cnt[h[j]]++;
            }
            for(int j = queries[i - 1].X.X; j < queries[i].X.X; j++)
            {
                if(h[j] >= it)
                {
                    suma--;
                }
                cnt[h[j]]--;
            }
        }
        while(suma < it)
        {
            it--;
            suma += cnt[it];
        }
        while(suma - cnt[it] >= it + 1)
        {
            suma -= cnt[it];
            it++;
        }/*
        for(int e = 0; e <= n; e++)
        {
            cout << cnt[e] << " ";
        }
        cout << "\n";
        cout << l << " " << r << " " << suma << " " << it << "\n";*/
        qans[queries[i].Y] = it;
    }
    for(int j =0; j < q; j++)
    {
        cout << qans[j] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...