#include <bits/stdc++.h>
using namespace std;
const int N = 100'000;
const int M = 18;
const int INF = 1'000'000'000;
int n,k,  q, a[N + 10];
int nxt[2][N + 10], h[N + 10];
int rmq[2][N + 10][M + 2];
vector<int> adj[N + 10];
void readInput() {
    cin >> n >> k >> q;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
}
void calcLft() {
    stack<int> st;
    for (int i = 1; i <= n; i++) {
        while (st.size() && a[st.top()] < a[i])
            st.pop();
        nxt[0][i] = (st.size()? st.top(): 0);
        st.push(i);
    }
}
void calcRght() {
    stack<int> st;
    for (int i = n; i >= 1; i--) {
        while (st.size() && a[st.top()] < a[i])
            st.pop();
        nxt[1][i] = (st.size()? st.top(): 0);
        st.push(i);
    }
}
void calcRMQ() {
    for (int t = 0; t < 2; t++) {
        for (int i = 1; i <= n; i++)
            rmq[t][i][0] = nxt[t][i];
        for (int j = 1; j <= M; j++)
            for (int i = 1; i <= n; i++)
                rmq[t][i][j] = rmq[t][rmq[t][i][j - 1]][j - 1];
    }
}
int disL(int u, int v) {
    int sum = 0;
    for (int j = M; j >= 0; j--)
        if (rmq[0][u][j] && v < rmq[0][u][j]) {
            u = rmq[0][u][j];
            sum += (1 << j);
        }
    return (nxt[0][u] == v? sum + 1: INF);
}
int disR(int u, int v) {
    int sum = 0;
    for (int j = M; j >= 0; j--)
        if (rmq[1][u][j] && rmq[1][u][j] < v) {
            u = rmq[1][u][j];
            sum += (1 << j);
        }
    return (nxt[1][u] == v? sum + 1: INF);
}
int dis(int u, int tu, int v) {
    if (u == v)
        return 0;
    return (tu == 0? disL(u, v): disR(u, v));
}
/*int dis(int u, int tu, int v, int tv) {
    int sum = 0
    for (int j = M; j >= 0; j--) {
        int x = rmq[tu][u][j];
        int y = rmq[tv][v][j];
        if (x && y && x != y) {
            sum += (1 << j) + (1 << j);
            u = x;
            v = y;
        }
    }
    return (nxt[tu][u] && nxt[tu][u] == nxt[tv][v]? sum + 1: INF);
}*/
int dis(int u, int tu, int v, int tv) {
    cout << u << ' ' << tu << ' ' << v << ' ' << tv << ": start " << nxt[tu][u] << endl;
    int sum = 0;
    for (int j = M; j >= 0; j--) {
        int x = rmq[tu][u][j];
        if (x && dis(v, tv, x) == INF) {
            sum += (1 << j);
            u = x;
        }
    }
    if (nxt[tu][u]) {
        int d = dis(v, tv, nxt[tu][u]);
        cout << u << ' ' << tu << ' ' << v << ' ' << tv << ": " << nxt[tu][u] << endl;
        if (d == INF)
            return INF;
        return sum + d + 1;
    }
    return INF;
}
/*int chechL(int u, int v) {
    int lca = getMax()
}*/
void query() {
    int u, v;
    cin >> u >> v;
    if (u > v)
        swap(u, v);
    int ans = INF; //min({chechL(u, v), checkMid(u, v), checkR(u, v)});
    for (int tu = 0; tu < 2; tu++)
        for (int tv = 0; tv < 2; tv++)
            ans = min(ans, dis(u, tu, v, tv));
    cout << ans - 1 << flush;
}
void BFS(int src) {
    for (int i = 1; i <= n; i++)    
        h[i] = 0;
    queue<int> qu;
    h[src] = 1;
    qu.push(src);
    while (!qu.empty()) {
        int u = qu.front();
        qu.pop();
        for (auto v: adj[u])
            if (!h[v]) {
                h[v] = h[u] + 1;
                qu.push(v);
            }
    }
}
void query2() {
    int u, v;
    cin >> u >> v;
    BFS(u);
    cout << h[v] - 2 << '\n';
}
void addEdge(int u, int v) {
    if (v) {
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
}
void solve() {
    for (int i = 1; i <= n; i++) {
        addEdge(i, nxt[0][i]);
        addEdge(i, nxt[1][i]);
    }
    while (q--)
        query2();
    cout.flush();
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    readInput();
    calcLft();
    calcRght();
    //calcRMQ();
    solve();
    return 0;
}
| # | 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... |