제출 #894316

#제출 시각아이디문제언어결과실행 시간메모리
894316vjudge1Index (COCI21_index)C++17
110 / 110
827 ms6976 KiB
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <bitset>
#include <cstdint>
#include <cassert>
#include <functional>
#include <complex>
#include <climits>
#include <random>
using namespace std;
   
#define ll long long
#define pb push_back
#define ull unsigned long long
#define F first
#define S second
#define all(v) v.begin(), v.end()

const int INF = INT_MAX;
const int block = 500;

int t[200005], n, q;
int a[200001], ans[200001];

void upd(int i, int x){
    for(; i < 200005; i = (i | (i + 1)))
        t[i] += x;
}

int get(int r){
    int ret = 0;
    for(; r >= 0; r = ((r & (r + 1)) - 1)){
        ret += t[r];
    }
    return ret;
}

int get(int l, int r){
    return get(r) - get(l - 1);
}

bool cmp(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b){
    if(a.F.F / block == b.F.F / block)
        return a.F.S < b.F.S;
    return ((a.F.F / block) < (b.F.F / block));
}

void solve(){
    cin >> n >> q;
    for(int i = 1; i <= n; i++) cin >> a[i];
    vector<pair<pair<int, int>, int>> query;
    for(int i = 1; i <= q; i++){
        int l, r;
        cin >> l >> r;
        query.pb({{l, r}, i});
    }
    sort(all(query), cmp);
    int l = 1, r = 0;
    for(auto [p, i] : query){
        auto [tl, tr] = p;
        while(l > tl){
            l--;
            upd(a[l], 1);
        }
        while(r < tr){
            r++;
            upd(a[r], 1);
        }
        while(l < tl){
            upd(a[l], -1);
            l++;
        }
        while(r > tr){
            upd(a[r], -1);
            r--;
        }
        int L = 1, R = n + 1;
        while(R - L > 1){
            int mid = (L + R) / 2;
            if(mid <= get(mid, n)) L = mid;
            else R = mid;
        }
        ans[i] = L;
    }
    for(int i = 1; i <= q; i++) cout << ans[i] << '\n';
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    int xach = 1; 
    //cin >> xach;
    while(xach--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...