Submission #773952

# Submission time Handle Problem Language Result Execution time Memory
773952 2023-07-05T09:53:09 Z Valters07 Abracadabra (CEOI22_abracadabra) C++14
0 / 100
3000 ms 28612 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define fio ios_base::sync_with_stdio(0);cin.tie(0);
#define ll long long
#define en cin.close();return 0;
#define pb push_back
#define fi first//printf("%lli\n",cur);
#define se second//scanf("%lli",&n);
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 2e5+5;
struct node
{
    int prior, val, mx, sz, l, r;
};
vector<node> treap;
vector<pair<int,int> > qu[N];
int nw(int val)
{
    treap.pb({rng(),val,val,1,0,0});
    return treap.size()-1;
}

void update(int node){
    if(node == 0) return;
    int l = treap[node].l, r = treap[node].r;
    treap[node].mx = max({treap[node].val,treap[l].mx,treap[r].mx});
    treap[node].sz = treap[l].sz+treap[r].sz+1;
}

int merg(int t1, int t2)
{
    if(!t1||!t2)
        return (t1|t2);
    if(treap[t1].prior<treap[t2].prior)
    {
        treap[t1].r=merg(treap[t1].r,t2);
        update(t1);
        return t1;
    }
    else
    {
        treap[t2].l=merg(t1,treap[t2].l);
        update(t2);
        return t2;
    }
}
pair<int,int> splitbysize(int t, int k)
{
    if(!t)
        return {0,0};
    int l = treap[t].l, r = treap[t].r, sz = treap[l].sz;
    if(sz>=k)
    {
        pair<int,int> tt = splitbysize(l,k);
        treap[t].l=tt.se;
        update(t);
        return {tt.fi,t};
    }
    else
    {
        pair<int,int> tt = splitbysize(r,k-treap[l].sz-1);
        treap[t].r=tt.fi;
        update(t);
        return {t,tt.se};
    }
}
pair<int,int> splitbymax(int t, int val)
{
    if(!t)
        return {0,0};
    int l = treap[t].l, r = treap[t].r;
    if(treap[l].mx>val||treap[t].val>val)
    {
        pair<int,int> tt = splitbymax(l,val);
        treap[t].l=tt.se;
        update(t);
        return {tt.fi,t};
    }
    else
    {
        pair<int,int> tt = splitbymax(r,val);
        treap[t].r=tt.fi;
        update(t);
        return {t,tt.se};
    }
}
vector<int> make_op(vector<int> &a)
{
    int n = a.size();
    vector<int> ret;
    int it = 0, it2 = n/2;
    while(it<n/2||it2<n)
    {
        if(it==n/2)
            ret.pb(a[it2++]);
        else if(it2==n)
            ret.pb(a[it++]);
        else if(a[it]<a[it2])
            ret.pb(a[it++]);
        else
            ret.pb(a[it2++]);
    }
    return ret;
}
int main()
{
    fio
//    ifstream cin("in.in");
    treap.pb({0,0,0,0,0,0});
    int n, q, r = 1;
    cin >> n >> q;
    vector<int> a(n), ans(q);
    for(auto &x:a)
        cin >> x;
    for(int qi = 0;qi<q;qi++)
    {
        int t, x;
        cin >> t >> x;
        qu[min(t,N-1)].pb({x,qi});
    }
    for(int i = 0;i<n;i++)
    {
        if(i==0)
        {
            for(auto x:qu[i])
                ans[x.se]=a[x.fi-1];
            a=make_op(a);
            r=nw(a[0]);
            for(int i = 1;i<n;i++)
                r=merg(r,nw(a[i]));
        }
        else
        {
            for(auto x:qu[i])
            {
                auto t = splitbysize(r,x.fi);
                auto t2 = splitbysize(t.fi,x.fi-1);
                ans[x.se]=treap[t2.se].val;
                r=merg(t2.fi,merg(t2.se,t.se));
            }
            auto t = splitbysize(r,n/2);
            while(treap[t.se].sz>1)
            {
                auto t1 = splitbysize(t.se,1);
                int val = treap[t1.fi].val;
                auto t2 = splitbymax(merg(t1.fi,t1.se),val);
                auto t3 = splitbymax(t.fi,val);
                t.fi=merg(merg(t3.fi,t2.fi),t3.se);
                t.se=t2.se;
            }
            r=merg(t.fi,t.se);
        }
    }
    for(auto x:ans)
        cout << x << "\n";
//    cin.close();
    return 0;
}

Compilation message

Main.cpp: In function 'int nw(int)':
Main.cpp:21:18: warning: narrowing conversion of 'rng.std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::operator()()' from 'std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::result_type' {aka 'long unsigned int'} to 'int' [-Wnarrowing]
   21 |     treap.pb({rng(),val,val,1,0,0});
      |               ~~~^~
# Verdict Execution time Memory Grader output
1 Incorrect 588 ms 22984 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3078 ms 28612 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3042 ms 11072 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 588 ms 22984 KB Output isn't correct
2 Halted 0 ms 0 KB -