#include "books.h"
#include <bits/stdc++.h>
using namespace std;
#define NL "\n"
#define EL cout << NL
#define FOR(i,n) for (long long i = 0; i < (n); i++)
#define FORS(i,s,n) for (long long i = (s); i < (n); i++)
#define FORR(i,n) for (long long i = (n)-1; i >= 0; i--)
#define PRINTV(v) for (auto a: v) {cout << a << " ";} EL;
#define PRINTVV(v) for (auto a: v) {PRINTV(v);}
#define f first
#define s second
#define all(v) (v).begin(),(v).end()
typedef long long ll;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll,ll> pl;
typedef vector<pl> vpl;
typedef vector<vpl> vvpl;
vl dsu;
vl sz;
ll find(ll u) {
    if (dsu[u] == u) return u;
    return dsu[u] = find(dsu[u]);
}
void unite(ll a, ll b) {
    ll x = find(a);
    ll y = find(b);
    if (x == y) return;
    if (sz[x] < sz[y]) swap(x,y);
    sz[x] += sz[y];
    dsu[y] = x;
}
long long minimum_walk(std::vector<int> p, int s) {
    int farthest = 0;
    ll n = p.size();
    ll ans = 0;
    deque<ll> empty(n-1);
    dsu.resize(n);
    sz.assign(n,1);
    FOR(i,n) dsu[i] = i;
    FOR(i,n) unite(i,p[i]);
    FOR(i,n) {
        if (i > farthest) empty[i-1] = true;
        if (p[i] < i) continue;
        ans += 2*(p[i]-i);
        farthest = max(farthest,p[i]);
    }
    ll i = 0;
    while (i < s) {
        if (!empty.front()) break;
        empty.pop_front();
        i++;
    }
    i = n-2;
    while (i >= s) {
        if (!empty.back()) break;
        empty.pop_back();
        i--;
    }
    for (auto x: empty) ans += 2*x;
    set<pl> ranges;
    FOR(i,n) {
        ll a = i;
        ll b = p[i];
        if (a > b) swap(a,b);
        ranges.insert({a,b});
    }
    set<pl> open;
    vpl merged;
    for (auto [a,b]: ranges) {
        while (!open.empty() && (*open.begin()).f < a) {
            auto [y,x] = *open.begin();
            merged.push_back({x,y});
            open.erase(open.begin());
        }
        ll earliest = a;
        while (!open.empty() && (*open.begin()).f < b) {
            auto [y,x] = *open.begin();
            earliest = min(earliest,x);
            open.erase(open.begin());
            unite(x,a);
        }
        open.insert({b,earliest});
    }
    while (!open.empty() && (*open.begin()).f < n) {
        auto [y,x] = *open.begin();
        merged.push_back({x,y});
        open.erase(open.begin());
    }
    vl side1(n,1e18);
    vl side2(n,-1e18);
    FOR(i,n) {
        ll j = find(i);
        if (i <= s) side1[j] = min(side1[j],i);
        if (i >= s) side2[j] = max(side2[j],i);
    }
    ll id = -1;
    FOR(i,n) {
        ll j = find(i);
        if (side1[j] != 1e18 && side2[j] != -1e18) {
            id = j;
            break;
        }
    }
    vvl g(n);
    FOR(i,n-1) {
        ll a = find(i);
        ll b = find(i+1);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    vl dist(n,1e18);
    dist[find(s)] = 0;
    deque<ll> q;
    q.push_back(find(s));
    while (!q.empty()) {
        ll u = q.front();
        q.pop_front();
        for (auto v: g[u]) {
            if (dist[v] > dist[u]+1) {
                dist[v] = dist[u]+1;
                q.push_back(v);
            }
        }
    }
    ans += dist[id]*2;
    return ans;
}
| # | 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... |