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>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
struct node {
	int l, r, v;
	node(int l, int r, int v):l(l),r(r),v(v){}
};
int n, k, q;
struct perstree {
	vector<node> tree;
	int init(int s=0, int e=n-1) {
		if (s==e) {
			tree.push_back(node(-1,-1,0));
			return (int)tree.size()-1;
		}
		int m = (s+e)>>1;
		tree.push_back(node(init(s,m),init(m+1,e),0));
		return (int)tree.size()-1;
	}
	int upd(int idx, int val, int ori, int s=0, int e=n-1) {
		if (e<idx||idx<s) return ori;
		if (s==e) {
			tree.push_back(tree[ori]);
			tree.back().v++;
			return (int)tree.size()-1;
		}
		int m = (s+e)>>1;
		int l = upd(idx,val,tree[ori].l,s,m), r = upd(idx,val,tree[ori].r,m+1,e);
		tree.push_back(node(l,r,tree[l].v+tree[r].v));
		return (int)tree.size()-1;
	}
	int getv(int S, int E, int cur, int s=0, int e=n-1) {
		if (e<S||E<s) return 0;
		if (S<=s&&e<=E) return tree[cur].v;
		int m = (s+e)>>1;
		return getv(S,E,tree[cur].l,s,m)+getv(S,E,tree[cur].r,m+1,e);
	}
} pst;
int l[100100], head[100100], ldx[100100];
vector<int> his[100100];
pii lis[100100][2];
set<int> s;
pii nxtl(int s, int lev) {
	if (s<0) return pii(-1,-1);
	if (l[s]>lev) return pii(0,s);
	return lis[s][0];
}
pii nxtr(int s, int lev) {
	if (s<0) return pii(-1,-1);
	if (l[s]>lev) return pii(0,s);
	return lis[s][1];
}
int dis;
pii v[5];
pii upd(pii a, int lev) {
	int i, p = 0;
	pii tmp = nxtl(a.x,lev);
	if (~tmp.second) v[p++] = tmp;
	tmp = nxtr(a.x,lev);
	if (~tmp.second) v[p++] = tmp;
	tmp = nxtl(a.y,lev);
	if (~tmp.second) v[p++] = tmp;
	tmp = nxtr(a.y,lev);
	if (~tmp.second) v[p++] = tmp;
	if (p==0) return pii(-1,-1);
	sort(v,v+p);
	int mini = v[0].first; pii res = pii(-1,-1);
	dis = mini;
	for (i=0;i<p;i++) {
		if(v[i].first==mini) {
			if (~res.first) res.second = v[i].second;
			else res.first = v[i].second;
		}
	}
	return res;
}
int psum[22][100100];
int ddd(int a, int b, int lev) {
	if (a<0||b<0) return 123456;
	if (a>b) swap(a,b);
	if (k<=20) return psum[lev][b]-psum[lev][a];
	return pst.getv(a,b,head[ldx[lev]])-1;
}
int mind(pii a, pii b, int lev) {
	return min({ddd(a.x,b.x,lev),ddd(a.y,b.x,lev),ddd(a.x,b.y,lev),ddd(a.y,b.y,lev)});
}
void ans(int s, int e) {
	if (l[s]<l[e]) swap(s,e);
	int i, dab = 0, rres = 987654321; pii a, b;
	a = pii(s,-1), b = pii(e,-1);
	for (i=l[e];i<l[s];i++) {
		dis = 0; b=upd(b,i); dab += dis;
	}
	for (i=l[s];i<k;i++) {
		rres = min(rres,dab+mind(a,b,i));
		dis = 0; a=upd(a,i); dab += dis;
		dis = 0; b=upd(b,i); dab += dis;
	}
	rres = min(rres,dab+mind(a,b,k));
	printf("%d\n",rres-1);
}
void add(int a, int b, int c, int t) {
	lis[a][t] = pii(c,b);
}
int main() {
	int i, p;
	scanf("%d%d%d",&n,&k,&q);
	for (i=0;i<n;i++) {
		scanf("%d",&l[i]); l[i]--;
		his[l[i]].push_back(i);
		lis[i][0] = lis[i][1] = pii(-1,-1);
		if (k<=20) {
			for (int j=0;j<=l[i];j++) psum[j][i]++;
		}
	}
	if (k<=20) {
		for (i=0;i<=k;i++) {
			for (int j=0;j<n;j++) psum[i][j] += ((j)?psum[i][j-1]:0);
		}
	}
	head[n] = pst.init(0,n-1); ldx[k] = n;
	p = n-1;
	for (i=k-1;i>=0;i--) {
		for (auto &v : his[i]) {
			head[p] = pst.upd(v,1,head[p+1]); p--;
		}
		ldx[i] = p+1;
		for (auto &v : his[i]) {
			auto it = s.lower_bound(v);
			if (it!=s.begin()) {--it;add(v,*it,pst.getv(*it,v,head[ldx[i]])-1,0);}
			it = s.upper_bound(v);
			if (it!=s.end()) add(v,*it,pst.getv(v,*it,head[ldx[i]])-1,1);
		}
		for (auto &v : his[i]) s.insert(v);
	}
	for (i=0;i<q;i++) {
		int a, b;
		scanf("%d%d",&a,&b); --a; --b;
		ans(a,b);
	}
    return 0;
}
Compilation message (stderr)
railway_trip.cpp: In function 'int main()':
railway_trip.cpp:121:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d",&n,&k,&q);
                          ^
railway_trip.cpp:123:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&l[i]); l[i]--;
                    ^
railway_trip.cpp:153:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&a,&b); --a; --b;
                      ^| # | 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... |