제출 #1337175

#제출 시각아이디문제언어결과실행 시간메모리
1337175tit_manhIndex (COCI21_index)C++20
110 / 110
402 ms26088 KiB
/*
    author : TIT_manh
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <numeric> 
#include <functional>
#include <cassert>
#include <sstream>
#include <climits>
#define ll long long
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FOD(i,r,l) for (int i = r; i >= l; i--)
#define ALL(x) x.begin(), x.end()
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define fi first
#define se second
#define pb push_back
#define endl "\n"
#define m_int 0x3f3f3f3f
#define m_ll 0x3f3f3f3f3f3f3f3f
using namespace std;

const int maxn = 2e5 + 5;
int n, q, l[maxn], r[maxn], bit[maxn];
vector<int> pos[maxn];
vector<int> v[maxn];
vector<pair<int, int>> que;

void ciin() {
    cin >> n >> q;
    int x;
    FOR(i,1,n) {
        cin >> x;
        pos[x].pb(i);
    }
    que.pb({0, 0});
    int t1, t2;
    FOR(i,1,q) {
        cin >> t1 >> t2;
        que.pb({t1, t2});
        l[i] = 1; r[i] = (t2 - t1 + 1);
        v[(l[i] + r[i]) >> 1].pb(i);
    }
}

int ans[maxn];

void update(int i) {
    while (i <= n) {
        bit[i] += 1;
        i += i & -i;
    }
}

int sum(int i) {
    int res = 0;
    while (i > 0) {
        res += bit[i];
        i -= i & -i;
    }
    return res;
}
int get(int l, int r) {
    return sum(r) - sum(l - 1);
}

void solve() {
    int N = 2e5;
    FOR(tt,1,18) {
        FOR(i,1,n) bit[i] = 0;
        FOD(mid,N,1) {
            if ((int)pos[mid].size() > 0) for (auto& i : pos[mid]) update(i);
            if ((int)v[mid].size() == 0) continue;
            for (auto& i : v[mid]) {
                if (get(que[i].fi, que[i].se) >= mid) {
                    l[i] = mid + 1;
                    ans[i] = mid;
                    if (l[i] > r[i]) continue;
                    int m = (l[i] + r[i]) >> 1;
                    v[m].pb(i);
                }
                else {
                    r[i] = mid - 1;
                    if (l[i] > r[i]) continue;
                    int m = (l[i] + r[i]) >> 1;
                    v[m].pb(i);
                }
            }
            v[mid].clear();
        }
    }
    FOR(i,1,q) cout << ans[i] << endl;
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    ciin(); solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...