This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <math.h>
#include "xylophone.h"
using namespace std;
const int maxn = 5005;
int p[maxn];
bool appeared[maxn];
void solve(int n)
{
    for (int i = 1; i <= n; ++i)
    {
        appeared[i] = false;
    }
    int l = 1;
    int r = n;
    while (l <= r)
    {
        int mid = (l + r) >> 1;
        if (query(1, mid) == n - 1) r = mid - 1;
        else l = mid + 1;
    }
    int pos_n = l;
    p[pos_n] = n;
    appeared[n] = true;
    p[pos_n - 1] = p[pos_n] - query(pos_n - 1, pos_n);
    appeared[p[pos_n - 1]] = true;
    if (pos_n != n)
    {
        p[pos_n + 1] = p[pos_n] - query(pos_n, pos_n + 1);
        appeared[p[pos_n + 1]] = true;
    }
    for (int i = pos_n - 2; i >= 1; --i)
    {
        int x = query(i, i + 1);
        if (p[i + 1] + x > n)
        {
            p[i] = p[i + 1] - x;
            appeared[p[i]] = true;
            continue;
        }
        if (p[i + 1] - x <= 0)
        {
            p[i] = p[i + 1] + x;
            appeared[p[i]] = true;
            continue;
        }
        if (appeared[p[i + 1] + x] == true)
        {
            p[i] = p[i + 1] - x;
            appeared[p[i]] = true;
            continue;
        }
        if (appeared[p[i + 1] - x] == true)
        {
            p[i] = p[i + 1] + x;
            appeared[p[i]] = true;
            continue;
        }
        int y = abs(p[i + 1] - p[i + 2]);
        int z = query(i, i + 2);
        if (z == x + y)
        {
            if (p[i + 2] > p[i + 1])
            {
                p[i] = p[i + 1] - x;
                appeared[p[i]] = true;
            }
            else
            {
                p[i] = p[i + 1] + x;
                appeared[p[i]] = true;
            }
        }
        else
        {
            if (p[i + 1] > p[i + 2])
            {
                p[i] = p[i + 1] - x;
                appeared[p[i]] = true;
            }
            else
            {
                p[i] = p[i + 1] + x;
                appeared[p[i]] = true;
            }
        }
    }
    for (int i = pos_n + 2; i <= n; ++i)
    {
        int x = query(i - 1, i);
        if (p[i - 1] + x > n)
        {
            p[i] = p[i - 1] - x;
            appeared[p[i]] = true;
            continue;
        }
        if (p[i - 1] - x <= 0)
        {
            p[i] = p[i - 1] + x;
            appeared[p[i]] = true;
            continue;
        }
        if (appeared[p[i - 1] + x] == true)
        {
            p[i] = p[i - 1] - x;
            appeared[p[i]] = true;
            continue;
        }
        if (appeared[p[i - 1] - x] == true)
        {
            p[i] = p[i - 1] + x;
            appeared[p[i]] = true;
            continue;
        }
        int y = abs(p[i - 1] - p[i - 2]);
        int z = query(i - 2, i);
        if (z == x + y)
        {
            if (p[i - 2] > p[i - 1])
            {
                p[i] = p[i - 1] - x;
                appeared[p[i]] = true;
            }
            else
            {
                p[i] = p[i - 1] + x;
                appeared[p[i]] = true;
            }
        }
        else
        {
            if (p[i - 1] > p[i - 2])
            {
                p[i] = p[i - 1] - x;
                appeared[p[i]] = true;
            }
            else
            {
                p[i] = p[i - 1] + x;
                appeared[p[i]] = true;
            }
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        answer(i, p[i]);
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |