func_code_string: #include <bits/stdc++.h>   using namespace std;   using ll = long long;   using ld = long double;   template <typename T>   inline void read(T &x) {     char c;     bool nega = 0;     while ((!isdigit(c = getchar())) && (c !=  - ))       ;     if (c ==  - ) {       nega = 1;       c = getchar();     }     x = c - 48;     while (isdigit(c = getchar())) x = x * 10 + c - 48;     if (nega) x = -x;   }   template <typename T>   inline void writep(T x) {     if (x > 9) writep(x / 10);     putchar(x % 10 + 48);   }   template <typename T>   inline void write(T x) {     if (x < 0) {       putchar( - );       x = -x;     }     writep(x);   }   template <typename T>   inline void writeln(T x) {     write(x);     putchar(  n );   }   int n, s;   int a[2000];   deque<int> pos[2001];   map<int, int> m;   int f[2001];   int trace[2001];   int g[2001];   int dist_inc(int u, int v) {     if (v >= u) return v - u;     return v + n - u;   }   int dist_dec(int u, int v) {     if (v <= u) return u - v;     return u + n - v;   }   int dist(int u, int v) { return min(abs(u - v), n - abs(u - v)); }   void output(int x) {     putchar( +- [x < 0]);     writeln(abs(x));   }   void rebuild(int u) {     if (a[u] > 1) rebuild(trace[u]);     if ((a[u] == 1) && (a[s] == 1)) {       output(0);       return;     }     int x = a[u];     int sz = pos[x].size();     int i = trace[u];     if (pos[x].size() == 1) {       if (dist(i, u) == dist_inc(i, u)) {         output(dist(i, u));       } else {         output(-dist(trace[u], u));       }     } else {       while (dist_inc(pos[x].back(), i) + dist_inc(i, pos[x].front()) !=              dist_inc(pos[x].back(), pos[x].front())) {         pos[x].push_back(pos[x].front());         pos[x].pop_front();       }       if (i == s) {         if (a[s] == 0)           g[s] = 0;         else           g[s] = f[s];       }       int maxs = dist_inc(i, pos[x].front());       int tmax = pos[x].front();       for (int j = (0); j < (sz); j++) {         if (j) {           if (maxs < dist_inc(pos[x][j - 1], pos[x][j])) {             maxs = dist_inc(pos[x][j - 1], pos[x][j]);             tmax = pos[x][j];           }         }         if (pos[x][j] == u) break;       }       if (f[u] == g[i] + n + dist_inc(i, u) - maxs * 2) {         int last = i;         for (int j = (0); j < (sz); j++) {           if (pos[x][j] == tmax) break;           last = pos[x][j];           output(dist_inc((j == 0) ? i : pos[x][j - 1], pos[x][j]));         }         for (int j = (sz - 1); j >= (0); j--) {           output(-dist_dec((j == sz - 1) ? last : pos[x][j + 1], pos[x][j]));           if (pos[x][j] == tmax) {             if (tmax == u) break;             output(dist_inc(tmax, u));             break;           }         }         return;       }       maxs = dist_dec(i, pos[x].back());       tmax = pos[x].back();       for (int j = (sz - 1); j >= (0); j--) {         if (j < sz - 1) {           if (maxs < dist_dec(pos[x][j + 1], pos[x][j])) {             maxs = dist_dec(pos[x][j + 1], pos[x][j]);             tmax = pos[x][j];           }         }         if (pos[x][j] == u) break;       }       if (f[u] == g[i] + n + dist_dec(i, u) - maxs * 2) {         int last = i;         for (int j = (sz - 1); j >= (0); j--) {           if (pos[x][j] == tmax) break;           last = pos[x][j];           output(-dist_dec((j == sz - 1) ? i : pos[x][j + 1], pos[x][j]));         }         for (int j = (0); j < (sz); j++) {           output(dist_inc((j == 0) ? last : pos[x][j - 1], pos[x][j]));           if (pos[x][j] == tmax) {             if (tmax == u) break;             output(-dist_dec(tmax, u));             break;           }         }         return;       }     }   }   int main() {     read(n);     read(s);     s--;     for (int i = (0); i < (n); i++) read(a[i]);     if (a[s] == *min_element(a, a + n)) {       a[s]--;     }     for (int i = (0); i < (n); i++) m[a[i]] = 0;     {       int cnt = 0;       for (auto &t : m) t.second = ++cnt;     }     for (int i = (0); i < (n); i++) {       a[i] = m[a[i]];       pos[a[i]].push_back(i);     }     if (a[s] != 1) pos[0].push_back(s);     for (int x = (1 + (a[s] == 1)); x <= (m.size()); x++) {       for (int i : pos[x - 1]) g[i] = f[i];       for (int i : pos[x]) f[i] = 1e9;       int sz = pos[x].size();       for (int i : pos[x - 1]) {         if (pos[x].size() == 1) {           if (f[pos[x][0]] > g[i] + dist(i, pos[x][0])) {             f[pos[x][0]] = g[i] + dist(i, pos[x][0]);             trace[pos[x][0]] = i;           }         } else {           while (dist_inc(pos[x].back(), i) + dist_inc(i, pos[x].front()) !=                  dist_inc(pos[x].back(), pos[x].front())) {             pos[x].push_back(pos[x].front());             pos[x].pop_front();           }           int maxs = dist_inc(i, pos[x].front());           for (int j = (0); j < (sz); j++) {             if (j) maxs = max(maxs, dist_inc(pos[x][j - 1], pos[x][j]));             if (f[pos[x][j]] > g[i] + n + dist_inc(i, pos[x][j]) - maxs * 2) {               f[pos[x][j]] = g[i] + n + dist_inc(i, pos[x][j]) - maxs * 2;               trace[pos[x][j]] = i;             }           }           maxs = dist_dec(i, pos[x].back());           for (int j = (sz - 1); j >= (0); j--) {             if (j + 1 < sz) maxs = max(maxs, dist_dec(pos[x][j + 1], pos[x][j]));             if (f[pos[x][j]] > g[i] + n + dist_dec(i, pos[x][j]) - maxs * 2) {               f[pos[x][j]] = g[i] + n + dist_dec(i, pos[x][j]) - maxs * 2;               trace[pos[x][j]] = i;             }           }         }       }     }     int best = pos[m.size()][0];     for (int i : pos[m.size()])       if (f[i] < f[best]) best = i;     writeln(f[best]);     rebuild(best);   }   