#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef pair<ll, ll> p2;
#define rep(i, high) for (ll i = 0; i < (high); i++)
#define repp(i, lo, high) for (ll i = (lo); i < (high); i++)
#define repe(i, container) for (auto& i : container)
#define sz(x) ((ll)(x).size())
#define all(x) begin(x), end(x)
struct Tree
{
	vector<p2> tree;
	Tree(int n) : tree(n*4) {}
	p2 merge(p2 a, p2 b)
	{
		if (a.first <= b.first) return a;
		return b;
	}
	void set(int x, int l, int r, int i, ll v)
	{
		if (l == r) return void(tree[x] = p2(v, l));
		int mid = (l + r) / 2;
		if (i <= mid) set(x * 2, l, mid, i, v);
		else set(x * 2 + 1, mid + 1, r, i, v);
		tree[x] = merge(tree[x * 2], tree[x * 2 + 1]);
	}
	p2 query(int x, int l, int r, int ql, int qr)
	{
		if (r<ql || l>qr) return p2(inf, 0);
		if (l >= ql && r <= qr) return tree[x];
		int mid = (l + r) / 2;
		return merge(query(x * 2, l, mid, ql, qr), query(x * 2 + 1, mid + 1, r, ql, qr));
	}
};
vi real_heights;
void init(int k, std::vector<int> r) {
	int n = sz(r);
	real_heights.resize(n);
	auto norm = [&](int x)
		{
			if (x < 0) x %= n, x += n;
			if (x >= n) return x % n;
			return x;
		};
	Tree tree(n);
	rep(i, n) tree.set(1, 0, n - 1, i, r[i]);
	auto find_zero = [&](int ql, int qr)
		{
			ql = norm(ql); qr = norm(qr);
			p2 q;
			if (ql < qr) q = tree.query(1, 0, n - 1, ql, qr);
			else q = tree.merge(tree.query(1, 0, n - 1, 0, qr), tree.query(1, 0, n - 1, ql, n - 1));
			if (q.first == 0) return q.second;
			return -1LL;
		};
	ll ind = n - 1;
	rep(i, n)
	{
		ll j = find_zero(0, n-1);
		if (j == -1) break;
		vi st = { j };
		while (sz(st))
		{
			ll u = st.back();
			ll v = find_zero(u - k + 1, u - 1);
			if (v == -1)
			{
				st.pop_back();
				real_heights[u] = ind--;
				repp(i, u - k + 1, u)
				{
					ll old = tree.query(1, 0, n - 1, norm(i), norm(i)).first;
					tree.set(1, 0, n - 1, norm(i), old - 1);
				}
				tree.set(1, 0, n - 1, u, inf);
			}
			else
			{
				st.push_back(v);
			}
		}
	}
	return;
}
int compare_plants(int x, int y) {
	if (real_heights[x] > real_heights[y]) return 1;
	return -1;
}
#if _LOCAL
static int n, k, q;
static std::vector<int> r;
static std::vector<int> x;
static std::vector<int> y;
static std::vector<int> answer;
int main() {
	assert(scanf("%d%d%d", &n, &k, &q) == 3);
	r.resize(n);
	answer.resize(q);
	for (int i = 0; i < n; i++) {
		int value;
		assert(scanf("%d", &value) == 1);
		r[i] = value;
	}
	x.resize(q);
	y.resize(q);
	for (int i = 0; i < q; i++) {
		assert(scanf("%d%d", &x[i], &y[i]) == 2);
	}
	fclose(stdin);
	init(k, r);
	for (int i = 0; i < q; i++) {
		answer[i] = compare_plants(x[i], y[i]);
	}
	for (int i = 0; i < q; i++) {
		printf("%d\n", answer[i]);
	}
	fclose(stdout);
	return 0;
}
#endif
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |