#include <bits/stdc++.h>
using namespace std;
int main() {
	int n, k, q;
	cin >> n >> k >> q;
	vector<int> lvl(n);
	vector<int> adj[n];
	for(int i=0;i<n;i++)
		cin >> lvl[i];
	int lft[n], distl[n], rgt[n], distr[n];
	stack<int> s;
	for(int i=0;i<n;i++) {
		while(s.size() && lvl[s.top()] < lvl[i])
			s.pop();
		if(s.size()) {
			if(lvl[s.top()] == lvl[i])
				lft[i] = lft[s.top()], distl[i] = distl[s.top()] + 1;
			else
				lft[i] = s.top(), distl[i] = 1;
		} else
			lft[i] = -1, distl[i] = 0;
		s.push(i);
	}
	while(s.size())
		s.pop();
	for(int i=n;i--;) {
		while(s.size() && lvl[s.top()] < lvl[i])
			s.pop();
		if(s.size()) {
			if(lvl[s.top()] == lvl[i])
				rgt[i] = rgt[s.top()], distr[i] = distr[s.top()] + 1;
			else
				rgt[i] = s.top(), distr[i] = 1;
		} else
			rgt[i] = -1, distr[i] = 0;
		s.push(i);
	}
	/*
	for(int i=0;i<n;i++)
		printf("lft rgt dl dr %d = %d %d %d %d\n",i,lft[i],rgt[i],distl[i],distr[i]);
	*/
	while(q--) {
		int alv, arv, blv, brv, ald = 0, ard = 0, bld = 0, brd = 0, ans = 1e9;
		cin >> alv >> blv;
		arv = --alv;
		brv = --blv;
		for(int i=2;1;i++) {
			if(lft[alv] == lft[blv] && lvl[alv] == lvl[blv])
				ans = min(ans, abs(distl[blv] - distl[alv]) + ald + bld);
			if(rgt[arv] == rgt[brv] && lvl[arv] == lvl[brv])
				ans = min(ans, abs(distr[brv] - distr[arv]) + ard + brd);
			if(i == k + 1)
				break;
			if(lvl[alv] < i) {
				ald += distl[alv];
				alv = lft[alv];
			}
			if(lvl[arv] < i) {
				ard += distr[arv];
				arv = rgt[arv];
			}
			if(lvl[blv] < i) {
				bld += distl[blv];
				blv = lft[blv];
			}
			if(lvl[brv] < i) {
				brd += distr[brv];
				brv = rgt[brv];
			}
			ald = min(ald, ard + 1);
			ard = min(ard, ald + 1);
			bld = min(bld, brd + 1);
			brd = min(brd, bld + 1);
			if(arv == blv) {
				ans = min(ans, ard + bld);
				break;
			}
			if(alv == brv) {
				ans = min(ans, ald + brd);
				break;
			}
		}
		cout << ans - 1 << "\n";
	}
}
| # | 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... |