제출 #1151454

#제출 시각아이디문제언어결과실행 시간메모리
1151454IssaAbracadabra (CEOI22_abracadabra)C++20
100 / 100
388 ms27932 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define ent "\n"

const int maxn = 2e6 + 100;
const ll INF = (ll)1e18 + 100;
const int inf = 1e7 + 100;
const ll MOD = 1e9 + 7;
const int maxl = 16;
const ll P = 31;

int n, q;
int f[maxn];
int a[maxn];
int b[maxn];
int r[maxn];
int ans[maxn];
int d[maxn * 4];

void upd(int i, int x, int v = 1, int tl = 1, int tr = n){
    if(tl == tr){
        d[v] = x;
    } else{
        int mid = (tl + tr) >> 1;
        if(i <= mid) upd(i, x, v<<1, tl, mid);
        else upd(i, x, v<<1|1, mid+1, tr);
        d[v] = d[v<<1] + d[v<<1|1];
    }
}

pii get(int k, int v = 1, int tl = 1, int tr = n){
    if(tl == tr) return {tl, k};
    int mid = (tl + tr) >> 1;
    if(d[v<<1] >= k) return get(k, v<<1, tl, mid);
    else return get(k - d[v<<1], v<<1|1, mid+1, tr);
}

void test(){
    cin >> n >> q;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    vector<pair<int, pii>> v;
    for(int i = 1; i <= q; i++){
        int t, p;
        cin >> t >> p;
        if(!t) ans[i] = a[p];
        else v.push_back({t, {p, i}});
    } 
    for(int k = 1, i = 1, j = n / 2 + 1; k <= n; k++){
        if(i <= n / 2 && (j > n || a[i] < a[j])) b[k] = a[i++];
        else b[k] = a[j++];
    } for(int i = n; i > 0; i--){
        a[i] = b[i]; f[a[i]] = i; r[i] = i + 1;
        while(r[i] <= n && a[r[i]] < a[i]) r[i] = r[r[i]];
    } for(int i = 1; i <= n; i = r[i]){
        upd(a[i], r[i] - i);
    } v.push_back({1, {0, 0}});
    sort(v.begin(), v.end());
    for(int i = 1; i < v.size(); i++){
        for(int cnt = 0; cnt < v[i].first - v[i-1].first; cnt++){
            auto [x, d] = get(n / 2); x = f[x];
            if(r[x] - x == d) break;
            int end = r[x]; r[x] = x + d;
            for(int i = x; i < end; i = r[i]){
                r[i] = min(r[i], end);
                upd(a[i], r[i] - i);
            }
        } auto [p, id] = v[i].second;
        auto [x, d] = get(p);
        ans[id] = a[f[x] + d - 1];
    } for(int i = 1; i <= q; i++){
        cout << ans[i] << ent; 
    }
} 

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int t = 1;
    while(t--) test();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...