Submission #739633

#TimeUsernameProblemLanguageResultExecution timeMemory
739633danikoynovAbracadabra (CEOI22_abracadabra)C++14
10 / 100
3060 ms24328 KiB
/**
 ____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|

**/

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 2e5 + 10, maxq = 1e6 + 10;

int n, q, a[maxn], ans[maxq], b[maxn];
vector < pair < int, int > > ask[maxn];

void shuffle_array()
{
    deque < int > d1, d2;
    for (int i = 1; i <= n / 2; i ++)
        d1.push_back(b[i]);
    for (int i = n / 2 + 1; i <= n; i ++)
        d2.push_back(b[i]);

    deque < int > res;
    while(!d1.empty() && !d2.empty())
    {
        if (d1.front() < d2.front())
        {
            res.push_back(d1.front());
            d1.pop_front();
        }
        else
        {
            res.push_back(d2.front());
            d2.pop_front();
        }
    }

    while(!d1.empty())
    {
            res.push_back(d1.front());
            d1.pop_front();
    }

        while(!d2.empty())
    {
            res.push_back(d2.front());
            d2.pop_front();
    }

    for (int i = 1; i <= n; i ++)
        b[i] = res[i - 1];
}

void smart_shuffle()
{
    vector < pair < int, int > > seg;
    int i = 1;
    while(i <= n)
    {
        int j = i;
        while(j <= n && a[i] >= a[j])
            j ++;
        seg.push_back({i, j - 1});
        i = j;
    }

    pair < int, int > ps;
    for (int i = 0; i < seg.size(); i ++)
    {
        pair < int, int > cur = seg[i];
        if (cur.second == n / 2)
            return;
        if (cur.first <= n / 2 && cur.second > n / 2)
        {
            ps.first = n / 2 + 1;
            ps.second = cur.second;
            seg[i].second = n / 2;
        }
    }

    pair < int, int > sv = ps;
    int d = ps.first;
    while(d <= sv.second)
    {
        int dv = d;
        while(a[d] >= a[dv])
            dv ++;
        ps.first = d;
        ps.second = dv - 1;
        d = dv;
         for (int i = 0; i < seg.size(); i ++)
    {
        if (a[seg[i].first] > a[ps.first])
        {
            seg.insert(seg.begin() + i, ps);
            break;
        }
    }
    }




    vector < int > val;
    for (pair < int, int > cur : seg)
    {
        ///cout << "here " << cur.first << " " << cur.second << endl;
        for (int i = cur.first; i <= cur.second; i ++)
            val.push_back(a[i]);
    }

    for (int i = 1; i <= n; i ++)
        a[i] = val[i - 1];

}
void solve()
{
    cin >> n >> q;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        b[i] = a[i];
    }

    for (int i = 1; i <= q; i ++)
    {
        int t, v;
        cin >> t >> v;
        t = min(t, n);
        if (t == 0)
            ans[i] = a[v];
        else
        ask[t].push_back({v, i});
    }

    shuffle_array();
    for (int i = 1; i <= n; i ++)
        a[i] = b[i];
    for (int f = 1; f <= n; f ++)
    {
        for (pair < int, int > cur : ask[f])
        {
            ans[cur.second] = a[cur.first];
        }

        /**for (int i = 1; i <= n; i ++)
            cout << a[i] << " ";
        cout << endl;*/
        ///shuffle_array();
        smart_shuffle();
        /**cout << "------------------" << endl;
        cout << "step " << f << endl;
        for (int i = 1; i <= n; i ++)
            if (a[i] != b[i])
            cout << "fuck " << i << " " << a[i] << " " << b[i] << endl;*/
    }

    for (int i = 1; i <= q; i ++)
        cout << ans[i] << endl;
}

int main()
{
    ///freopen("test.txt", "r", stdin);
    ///freopen("output.txt", "w", stdout);
    solve();
    return 0;
}
/**
10 0
3 8 2 4 9 5 10 1 6 7
*/

Compilation message (stderr)

Main.cpp: In function 'void smart_shuffle()':
Main.cpp:80:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for (int i = 0; i < seg.size(); i ++)
      |                     ~~^~~~~~~~~~~~
Main.cpp:103:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |          for (int i = 0; i < seg.size(); i ++)
      |                          ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...