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 <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
const int lg = 17;
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int N, K, Q;
	cin >> N >> K >> Q;
	vi L(1+N);
	for(int i = 1; i <= N; i++)
		cin >> L[i];
	int lh[1+lg][1+N], rh[1+lg][1+N];
	lh[0][1] = 1;
	for(int i = 2; i <= N; i++)
	{
		lh[0][i] = i-1;
		while(L[lh[0][i]] < L[i])
			lh[0][i] = lh[0][ lh[0][i] ];
	}
	rh[0][N] = N;
	for(int i = N-1; i >= 1; i--)
	{
		rh[0][i] = i+1;
		while(L[rh[0][i]] < L[i])
			rh[0][i] = rh[0][ rh[0][i] ];
	}
	for(int e = 1; e <= lg; e++)
	{
		for(int i = 1; i <= N; i++)
		{
			lh[e][i] = min(lh[e-1][lh[e-1][i]], lh[e-1][rh[e-1][i]]);
			rh[e][i] = max(rh[e-1][rh[e-1][i]], rh[e-1][lh[e-1][i]]);
		}
	}
	// cerr << "done\n";
	for(int q = 1; q <= Q; q++)
	{
		int a, b;
		cin >> a >> b;
		if(a > b)
			swap(a, b);
		int res = 0;
		int la = a, ra = a;
		for(int e = lg; e >= 0; e--)
		{
			if(max(rh[e][la], rh[e][ra]) < b)
			{
				res += (1<<e);
				int nla = min(lh[e][la], lh[e][ra]);
				int nra = max(rh[e][la], rh[e][ra]);
				la = nla;
				ra = nra;
			}
		}
		int lb = b, rb = b;
		for(int e = lg; e >= 0; e--)
		{
			if(min(lh[e][lb], lh[e][rb]) > ra)
			{
				res += (1<<e);
				int nlb = min(lh[e][lb], lh[e][rb]);
				int nrb = max(rh[e][lb], rh[e][rb]);
				lb = nlb;
				rb = nrb;
			}
		}
		cout << res << '\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... |