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 "books.h"
//author: erray
#include <bits/stdc++.h>
using namespace std;
 
#ifdef DEBUG
  #include "/home/ioi/codes/debug.h"
#else
  #define debug(...) (void) 37
#endif
long long minimum_walk(std::vector<int> P, int s) {
  int N = int(P.size());
	//assert(s == 0);
  long long res = 0;
  int start = 0, end = N - 1;
  while (start < N && P[start] == start) {
    ++start;
  }
  while (end >= 0 && P[end] == end) {
    --end;
  }
  if (start == N) {
    return 0;
  }
  //res += 2 * start;
  vector<int> upd(N);
  for (int i = 0; i < N; ++i) {
    int L = P[i], R = i;
    if (L > R) {
      swap(L, R);
    }
    upd[L] += 1;
    upd[R] -= 1;  
    res += (R - L);
  }
  for (int i = 0; i < N - 1; ++i) {
    upd[i + 1] += upd[i];
  }
  for (int i = start; i < end; ++i) {
    if (upd[i] == 0) {
      res += 2;
    }
  }
  debug(upd, res);
  vector<int> L(N, -1), R(N);
  for (int i = 0; i < N; ++i) {
    if (L[i] == -1) {
      int v = i;
      L[i] = R[i] = i;
      do {
        v = P[v];
        L[i] = min(L[i], v);
        R[i] = max(R[i], v);
      } while (v != i);
      do {
        v = P[v];
        L[v] = L[i];
        R[v] = R[i];
      } while (v != i);
    }
  }
  debug(start, end, res, L, R);
  
  if (s <= start) {
    res += (start - s) * 2;
  } else if (end <= s) {
    res += (s - end) * 2;
  } else {
    int l = s, r = s;
    int add = 0;
    while (upd[r] != 0) {
      debug(l, r);
      --l, ++r;
      ++add;
      int go_l = min(L[l], L[r]);
      int go_r = max(R[l], R[r]);
      while (go_l < l || go_r > r) {
        while (go_l < l) {
          --l;
          go_l = min(L[l], go_l);
          go_r = max(R[l], go_r);
        }
        while (go_r > r) {
          ++r;
          go_l = min(L[r], go_l);
          go_r = max(R[r], go_r);
        }
      }
    }
    res += 2 * add;
  } 
  return res;
}
| # | 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... |