Submission #240881

#TimeUsernameProblemLanguageResultExecution timeMemory
240881NONAMEZagonetka (COI18_zagonetka)C++14
100 / 100
90 ms564 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;

const int N = 2e2;

int n, p[N], pos[N];
bool is[N][N];
vector <int> g[N];

bool gd(vector <int> q) {
    cout << "query ";
    for (int i : q)
        cout << i << " ";
    cout << endl;
    
    //cerr << "query ";
    //for (int i : q)
        //cerr << i << " ";
    //cerr << "\n";
    
    bool x;
    cin >> x;
    return x;
}

void dfs(vector <int> &v, int u, int &cur, int upd) {
    if (v[u] != 0)
        return;
        
    for (int to : g[u])
        dfs(v, to, cur, upd);
    
    v[u] = cur;
    cur += upd;
}

void solve(vector <int> &v, int cur, int upd) {
    for (int i = 0; i < n; ++i)
        sort(g[i].begin(), g[i].end());
    
    for (int i = 0; i < n; ++i)
        if (v[i] == 0)
            dfs(v, i, cur, upd);
        
    for (int i = 0; i < n; ++i)
        g[i].clear();
}

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

    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> p[i];
        pos[p[i]] = i;
    }
    
    for (int i = 1; i <= n; ++i)
        is[i][i] = 1;
    
    for (int t = 1; t <= n; ++t)
    for (int i = 1; i + t <= n; ++i) {
        int j = i + t;
        
        bool f = 0;
        
        for (int k = i + 1; k < j; ++k)
            if (is[i][k] && is[k][j])
                f = 1;
        
        if (f) {
            is[i][j] = 1;
            continue;
        }
        
        //cerr << i << " " << j << " ";
        
        vector <int> vec;
        vec.clear();
        
        for (int k = i; k <= j; ++k)
            if (is[i][k] || is[k][j])
                vec.push_back(k);
                
        reverse(vec.begin(), vec.end());
                
        vector <int> qu;
        
        for (int k = 0; k < n; ++k)
            qu.push_back(p[k]);
        
        int ps = 0;
        
        for (int k = j; k >= i; --k)
            if (is[i][k])
                qu[pos[k]] = vec[ps++];
                
        for (int k = j; k >= i; --k)
            if (is[k][j])
                qu[pos[k]] = vec[ps++];
              
        f = gd(qu);
        //cerr << f << "\n";
                
        is[i][j] = f ^ 1;
    }
    
    vector <int> mn(n, 0), mx(n, 0);
    
    for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
        if (is[i][j])
            g[pos[j]].push_back(pos[i]);
    solve(mn, 1, +1);
    
    for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
        if (is[i][j])
            g[pos[i]].push_back(pos[j]);
    solve(mx, n, -1);
    
    cout << "end" << endl;
    
    for (int i = 0; i < n; ++i)
        cout << mn[i] << " ";
    cout << endl;
    
    for (int i = 0; i < n; ++i)
        cout << mx[i] << " ";
    cout << endl;
    
    //for (int i : mn)
        //cerr << i << " ";
    //cerr << "\n";
    
    //for (int i : mx)
        //cerr << i << " ";
    //cerr << "\n";
    
    //for (int i = 1; i <= n; ++i, cerr << endl)
    //for (int j = 1; j <= n; ++j)
        //cerr << is[i][j] << " ";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...