Submission #763754

#TimeUsernameProblemLanguageResultExecution timeMemory
763754swagchickenAbracadabra (CEOI22_abracadabra)C++14
100 / 100
768 ms65036 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef vector<int> vi;
typedef vector< vector <int> > vvi;
typedef pair<int, int> pii;
typedef pair < pair < int, int >, int > piii;
typedef pair < pair <int, int > , pair <int, int> > piiii;
typedef pair<ll, ll> pll;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
 
#define FOR(i,a,b) for(int i = a; i < b; i ++)
#define RFOR(i,a,b) for(int i = a-1; i >= b; i --)
#define all(a) a.begin(), a.end()
#define endl '\n';
#define sz(x) (int)(x).size()
 
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
 
template <typename T>
void pr(vector<T> &v) {
    FOR(i, 0, sz(v)) cout << v[i] << " ";
    cout << endl;
}
template <typename T>
void pr(vector<vector<T> > &v) {
    FOR(i, 0, sz(v)) { pr(v[i]); }
}
template <typename T>
void re(T &x) {
    cin >> x;
}
template <typename T>
void re(vector<T> &a) {
    FOR(i, 0, sz(a)) re(a[i]);
}
template <class Arg, class... Args>
void re(Arg &first, Args &... rest) {
    re(first);
    re(rest...);
}
template <typename T>
void pr(T x) {
    cout << x << endl;
}
template <class Arg, class... Args>
void pr(const Arg &first, const Args &... rest) {
    cout << first << " ";
    pr(rest...);
    cout << endl;
}
void ps() { cout << endl; }
template<class T, class... Ts>
void ps(const T& t, const Ts&... ts) {
    cout << t; if (sizeof...(ts)) cout << " "; ps(ts...);
}
 
const ll MOD  =  1000000007;
#define inf 1e18;
#define INF INT_MAX;
 
long double PI = 4*atan(1);
long double eps = 1e-8;

int N, q;
int n;

vi a;
vector<array<int, 3>> qs;

struct seg {
    int v, l, r;

    bool operator<(const seg& o) const {
        return v < o.v;
    }
};

map<seg, int> segidx;
set<seg> segs;
vector<seg> allsegs;

int st[2000000] = {};

void update(int p, int l, int r, int idx, int v) {
    if(l == r) {
        st[p] = v;
        return;
    }
    int m = (l + r)/2;
    if(idx <= m) {
        update(2*p, l, m, idx, v);
    } else {
        update(2*p + 1, m+1,r, idx, v);
    }
    st[p] = st[2*p] + st[2*p+1];
    return;
}

int query(int p, int l, int r, int v) {
    if(l == r) {
        return a[allsegs[l].l + v - 1];
    }
    int m = (l+r)/2;
    if(st[2*p] >= v) {
        return query(2*p, l, m, v);
    } 
    return query(2*p + 1, m + 1, r, v - st[2*p]);
}


vi bruteans;

vi brute() {
    vi b = a;
    int t = 0;

    vi c = b;
    int qidx = 0;
    vi ans(q);
    while(true) {
        
        while(qidx < q && qs[qidx][0] == t) {
            ans[qs[qidx][2]] = b[qs[qidx][1] - 1];
            qidx++;
        }

        c.clear();
        int lp = 0;
        int rp = 0;
        while(lp < n && rp < n) {
            if(b[lp] < b[n + rp]) {
                c.pb(b[lp]); lp++;
            } else {
                c.pb(b[n + rp]); rp++;
            }
        }
        while(lp < n) {c.pb(b[lp]); lp++;}
        while(rp < n) {c.pb(b[n + rp]); rp++;}

        if(c == b) break;
        b = c;
        t++;
    }

    
    while(qidx < q) {
        ans[qs[qidx][2]] = b[qs[qidx][1] - 1];
        qidx++;
    }
    
    return ans;
    
}
int main() {
    //auto start = chrono::high_resolution_clock::now();
    ios_base::sync_with_stdio(0);cin.tie(0);
    // freopen("promote.in", "r", stdin);
    // freopen("promote.out", "w", stdout);
    #ifdef DEBUG
      freopen("input.txt", "r", stdin);
      freopen("output.txt", "w", stdout);
    #endif 
    
    
    cin >> N >> q;
    n = N/2;

    a.resize(N); re(a);

    
    FOR(i,0,q) {
        int t,id; cin >> t >> id;
        qs.pb({t, id, i});
    }

    sort(all(qs));

    
    // vi bruteans = brute();

    stack<int> stk;
    vi nxt(N);
    FOR(i,0,N) {
        while(!stk.empty() && a[i] > a[stk.top()]) {
            nxt[stk.top()] = i - 1;
            stk.pop();
        }
        stk.push(i);
    }
    while(!stk.empty()) {
        int c = stk.top(); stk.pop();
        nxt[c] = N-1;
    }

    

    for(int i = 0; i < N; i = nxt[i] + 1) {
        segs.insert({a[i], i, nxt[i]});
        allsegs.pb({a[i], i, nxt[i]});
    }

    int len = N;
    while(len > n) {
        auto p = segs.rbegin();
        int clen = (*p).r - (*p).l + 1;
        while(len - clen >= n) {
            segs.erase(*p);
            len -= clen;
            if(!segs.empty()) p = segs.rbegin();
            clen = (*p).r - (*p).l + 1;
        }

        if(len > n) {
            int l = (*p).l; 
            int r = (*p).r;
            segs.erase(*p);
            
            int r1 = l + n - (len - clen) - 1;
            allsegs.pb({a[l], l, r1});
            segs.insert({a[l], l , r1});
            r1++;
            while(r1 <= r) {
                int r2 = min(nxt[r1], r);
                allsegs.pb({a[r1], r1, r2});
                segs.insert({a[r1], r1, r2});
                r1 = r2 + 1;
            }
        } 
    }

    sort(all(allsegs));
    int m = allsegs.size();
    FOR(i,0,m) segidx[allsegs[i]] = i;

    segs.clear();
    
    vi ans(q);
    int t = 0;
    int qidx = 0;
    
    for(int i = 0; i < N; i = nxt[i] + 1) {
        segs.insert({a[i], i, nxt[i]});
        int segid = segidx[{a[i], i, nxt[i]}];
        update(1, 0, m, segid, nxt[i] - i + 1);
    }

    while(qidx < q && qs[qidx][0] == t) {
        ans[qs[qidx][2]] = query(1, 0, m, qs[qidx][1]);
        qidx++;
    }

    len = N;
    while(len > n) {
        auto p = segs.rbegin();
        int clen = (*p).r - (*p).l + 1;
        while(len - clen >= n) {
            int segid = segidx[*p];
         //   update(1, 0, m, segid, 0);
            segs.erase(*p);
            len -= clen;
            if(!segs.empty()) p = segs.rbegin();
            clen = (*p).r - (*p).l + 1;
        }

        if(len > n) {
            int l = (*p).l; 
            int r = (*p).r;
            int segid = segidx[*p];
            update(1, 0, m, segid, 0);

            segs.erase(*p);
            
            
            int r1 = l + n - (len - clen) - 1;
            segs.insert({a[l], l , r1});

            segid = segidx[{a[l], l , r1}];
            update(1, 0, m, segid, r1 - l + 1);

            r1++;
            while(r1 <= r) {
                int r2 = min(nxt[r1], r);
                segs.insert({a[r1], r1, r2});

                segid = segidx[{a[r1], r1, r2}];
                update(1, 0, m, segid, r2 - r1 + 1);

                r1 = r2 + 1;
            }
        }
        
        t++;

        while(qidx < q && qs[qidx][0] == t) {
            ans[qs[qidx][2]] = query(1, 0, m, qs[qidx][1]);
            qidx++;
        }
    }

    while(qidx < q) {
        ans[qs[qidx][2]] = query(1, 0, m, qs[qidx][1]);
        qidx++;
    }

    FOR(i,0,q) {
        cout << ans[i] << endl;
    }


    





    

    
    // auto stop = chrono::high_resolution_clock::now();
    // auto duration = chrono::duration_cast<chrono::microseconds>(stop - start);
    // cout << duration.count() << endl;
    //cin.close();
    //cout.close();
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:266:17: warning: unused variable 'segid' [-Wunused-variable]
  266 |             int segid = segidx[*p];
      |                 ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...