func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, ini_pos;   vector<int> v[2020];   int a[2020], MAX;   map<int, int> mp;   int dist(int a, int b) {     if (a < b) swap(a, b);     return min(a - b, n - a + b);   }   void input() {     scanf( %d %d , &n, &ini_pos);     for (int i = 1; i <= n; i++) scanf( %d , a + i), mp[a[i]] = 0;     for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {       mp[it->first] = ++MAX;     }     for (int i = 1; i <= n; i++) a[i] = mp[a[i]], v[a[i]].push_back(i);   }   int f[2020], en[2020];   int same[2020], Same[2020], nxt[2020];   void prepare() {     v[0].push_back(ini_pos);     for (int m = MAX; m >= 0; m--) {       if (m < MAX) {         for (int i, j = 0; j < v[m].size(); j++) {           i = v[m][j];           int t = m ? i : 0;           en[t] = -1;           for (int ii, jj = 0; jj < v[m + 1].size(); jj++) {             ii = v[m + 1][jj];             int d = dist(i, ii);             if (en[t] == -1 || en[t] > d + f[ii]) {               nxt[t] = ii;               en[t] = d + f[ii];             }           }         }       }       if (!m) break;       int s = v[m].size();       for (int ii, i, j = 0; j < s; j++) {         i = v[m][j];         ii = v[m][(j + 1) % s];         same[i] = +1;         Same[i] = ii;         f[i] = en[ii] + (n - (ii >= i ? ii - i : ii - i + n));         if (ii == i) {           f[i] = en[ii];           continue;         }         ii = v[m][(j - 1 + s) % s];         int ff = en[ii] + (n - (i >= ii ? i - ii : i - ii + n));         if (f[i] > ff) f[i] = ff, same[i] = -1, Same[i] = ii;       }     }   }   void move(int a, int b) {     int d = dist(a, b);     if (d == b - a || d == b + n - a)       printf( %+d n , d);     else       printf( %+d n , -d);   }   void a_a(int s, int cur, int type) {     if (type == -1) reverse(v[s].begin(), v[s].end());     for (int I = -1, i = 0; i < v[s].size(); i = (i + 1) % (int(v[s].size()))) {       int t = v[s][i];       if (I == -1) {         if (t == cur) I = i;         continue;       }       if (I == i) return;       move(cur, t);       cur = t;     }   }   void solve() {     int cur = ini_pos;     printf( %d n , en[0]);     for (int s = 0; s < MAX;) {       int t = nxt[s ? cur : 0];       move(cur, t);       cur = t;       ++s;       a_a(s, cur, -same[cur]);       cur = Same[cur];     }   }   int main() {     input();     prepare();     solve();     return 0;   }   