Submission #1344483

#TimeUsernameProblemLanguageResultExecution timeMemory
1344483gkos5678OGLEDALA (COI15_ogledala)C++20
22 / 100
1155 ms19752 KiB
/*
i am doomed and i am screwed
i walk around in a living nightmare
i hate the present and i hate the past
wondering why i'm a dumbass
*/
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define lb lower_bound
#define ff first
#define ss second

typedef long long ll;
typedef pair<ll, ll> ii;
typedef pair<ll, ii> pii;
typedef vector<ii> vii;

const int maxn = 1e5 + 7;

ll m, n, q, a[maxn], b[maxn], d[maxn], l[maxn], in[maxn];
vii v;
set<pii> s;

void add(ll dlj, ll le, ll c){
    if (dlj == 0) return;
    pii lbb = *s.lb({-dlj, {le, 0}});
    if (lbb.ff != -dlj || lbb.ss.ff != le){
        s.insert({-dlj, {le, c}});
        return;
    }
    s.erase(s.find(lbb));
    lbb.ss.ss += c;
    s.insert(lbb);
}

ll cnt(ll d1, ll d2){
    v.clear();
    v.pb({d1, 1});
    ll ret = 0;
    for (int i = 0; i < v.size(); i++){
        if (v[i].ff == d2){
            ret += v[i].ss;
            continue;
        }
        ll s = v.size();
        ll dl = v[i].ff / 2 - 1, dr = v[i].ff / 2;
        dl += (v[i].ff & 1LL);
        if (dl >= d2){
            if (v.back().ff == dl) v.back().ss += v[i].ss;
            else if (s >= 2 && v[s - 2].ff == dl) v[s - 2].ss += v[i].ss;
            else v.pb({dl, v[i].ss});
        }
        if (dr >= d2){
            if (v.back().ff == dr) v.back().ss += v[i].ss;
            else if (s >= 2 && v[s - 2].ff == dr) v[s - 2].ff += v[i].ss;
            else v.pb({dr, v[i].ss});
        }
    }
    return ret;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> m >> n >> q;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
        if (a[i] > a[i - 1] + 1)
            s.insert({-a[i] + a[i - 1] + 1, {i - 1, 1}});
    }
    a[n + 1] = m + 1;
    if (m > a[n])
        s.insert({a[n] - m, {n, 1}});
    ll tr = q + 1;
    for (int i = 1; i <= q; i++){
        cin >> b[i];
        if (b[i] > n && tr == q + 1)
            tr = i;
    }

    ll uk = n;
    while(tr <= q){
        pii bg = *s.begin();
        s.erase(s.begin());
        ll dlj = -bg.ff, le = bg.ss.ff, c = bg.ss.ss;
        ll r = uk + c;
        while(tr <= q && b[tr] <= r){
            d[tr] = dlj, l[tr] = le, in[tr] = b[tr] - uk;
            tr++;
        }
        uk = r;
        if (dlj & 1LL)
            add(dlj / 2, le, c * 2LL);
        else {
            add(dlj / 2 - 1, le, c);
            add(dlj / 2, le, c);
        }
    }

    for (int i = 1; i <= q; i++){
        if (b[i] <= n){
            cout << a[b[i]] << "\n";
            continue;
        }
        ll le = a[l[i]] + 1, ri = a[l[i] + 1] - 1;
        while((ri - le + 1) > d[i]){
            ll mi = (le + ri) / 2;
            ll cn = cnt(mi - le, d[i]);
            if (cn >= in[i])
                ri = mi - 1;
            else {
                le = mi + 1;
                in[i] -= cn;
            }
        }
        cout << (le + ri) / 2 << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...