#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> adj; // i -> j implies h[i] > h[j]
int mat[5001][5001];
void dfs(int node, vector<int> &vis, int source) {
mat[source][node] = 1;
vis[node] = 1;
for (auto &neighbour : adj[node]) {
if (vis[neighbour]) continue;
dfs(neighbour, vis, source);
}
}
void init(int k, vector<int> r) {
n = (int)r.size();
vector<int> handled(n); adj.resize(n);
while (accumulate(handled.begin(), handled.end(), 0) != n) {
int pos = -1;
vector<int> poss;
for (int i = 0; i < n; i++) {
if (handled[i]) continue;
int s = 0;
for (int j = i + 1; j < i + k; j++) {
s += handled[j % n];
}
if (s == r[i]) {
poss.push_back(i);
}
}
for (int i = 0; i < (int)poss.size(); i++) {
int prev = (i + (int)poss.size() - 1) % ((int)poss.size());
if (poss[i] > poss[prev]) {
if (poss[i] >= poss[prev] + k) {
pos = poss[i];
break;
}
} else {
int y = (poss[prev] + k);
if (y < n) {
pos = poss[i];
break;
}
y %= n;
if (poss[i] >= y) {
pos = poss[i];
break;
}
}
}
if ((int)poss.size() == 1) pos = poss[0];
assert(pos != -1);
for (int j = pos + 1; j < pos + k; j++) {
if (handled[j % n]) {
adj[j % n].push_back(pos);
} else {
adj[pos].push_back(j % n);
}
}
handled[pos] = 1;
}
for (int i = 0; i < n; i++) {
vector<int> vis(n);
dfs(i, vis, i);
}
}
int compare_plants(int x, int y) {
// cout << "query" << mat[x][y] << " " << mat[y][x] << '\n';
if (!mat[x][y] && !mat[y][x]) return 0;
if (mat[x][y]) return 1;
else return -1;
}