#include <bits/stdc++.h>
#define int long long
#define f first
#define s second
using namespace std;
static constexpr long long INF = 1e18;
struct segtree
{
    vector<pair<int, int>> v;
    vector<pair<pair<int, int>, int>> a;
    void resz(int n, vector<pair<pair<int, int>, int>> w)
    {
        v.assign(4 * n, {INF, INF});
        a = w;
    }
    void init(int k, int l, int r)
    {
        if (l > r)
            return;
        if (l == r)
            v[k].f = a[l].f.s, v[k].s = l + 1;
        else
        {
            int m = (l + r) / 2;
            init(2 * k, l, m);
            init(2 * k + 1, m + 1, r);
            v[k] = min(v[2 * k], v[2 * k + 1]);
        }
    }
    void upd(int k, int l, int r, int p, int x)
    {
        if (l > r)
            return;
        if (l == r)
        {
            v[k].f = x;
            return;
        }
        int m = (r + l) / 2;
        if (p <= m)
            upd(2 * k, l, m, p, x);
        else
            upd(2 * k + 1, m + 1, r, p, x);
        v[k] = min(v[2 * k], v[2 * k + 1]);
    }
    pair<int, int> prod(int k, int x, int y, int l, int r)
    {
        if (l == x && y == r)
            return v[k];
        if (l > r)
            return {INF, INF};
        int m = (x + y) / 2;
        return min(prod(2 * k, x, m, l, min(m, r)), prod(2 * k + 1, m + 1, y, max(l, m + 1), r));
    }
};
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    int n, k;
    cin >> n >> k;
    vector<pair<pair<int, int>, int>> v(n);
    for (int i = 0; i < n; i++)
    {
        cin >> v[i].f.s >> v[i].f.f;
        v[i].s = i + 1;
    }
    sort(begin(v), end(v));
    vector<int> w(n), z(n);
    for (int i = 0; i < n; i++)
        w[i] = v[i].f.f, z[v[i].s - 1] = i + 1;
    int c = log2(n) + 1;
    vector<vector<int>> t(n + 1, vector<int>(c));
    t[0][0] = -1;
    segtree r;
    r.resz(n, v);
    r.init(1, 0, n - 1);
    for (int i = 1; i < n; i++)
    {
        r.upd(1, 0, n - 1, i, INF); // cout << lower_bound(begin(w),end(w),v[i].f.s)-begin(w) << ' ' << upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1 << ' ' << r.prod(1,0,n-1,lower_bound(begin(w),end(w),v[i].f.s)-begin(w),upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1).f << ' ' << r.prod(1,0,n-1,lower_bound(begin(w),end(w),v[i].f.s)-begin(w),upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1).s << '\n';
        t[i + 1][0] = r.prod(1, 0, n - 1, lower_bound(begin(w), end(w), v[i].f.s) - begin(w), upper_bound(begin(w), end(w), v[i].f.f) - begin(w) - 1).s;
        if (lower_bound(begin(w), end(w), v[i].f.s) - begin(w) == upper_bound(begin(w), end(w), v[i].f.f) - begin(w) - 1)
            t[i + 1][0] = -1;
        r.upd(1, 0, n - 1, i, v[i].f.s);
        if (t[i + 1][0] == INF)
            t[i + 1][0] = -1;
    }
    for (int i = 1; i < c; i++)
        for (int j = 0; j <= n; j++)
            if (t[j][i - 1] == -1)
                t[j][i] = -1;
            else
                t[j][i] = t[t[j][i - 1]][i - 1];
    // for (auto i : t)
    // {
    //     for (auto j : i)
    //         cout << j << ' ';
    //     cout << '\n';
    // }
    while (k--)
    {
        int x, y, a = 0;
        cin >> x >> y;
        x--, y--;
        int b = z[y];
        if (x == y)
        {
            cout << "0\n";
            continue;
        }
        for (int i = c - 1; i >= 0; i--)
        {
            if (t[b][i] >= z[x])
                a += (1 << i), b = t[b][i];
            if (b == -1)
                break; /*cout << a << ' ' << b << '\n';*/
        }
        if (b == z[x])
            cout << a << '\n';
        else
            cout << "impossible\n";
        // cout << z[x] << ' ' << z[y] << '\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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |