Problem p03677 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define pi 3.1415926535897932384626
using namespace std;

struct P {
  int x, y;
  bool operator<(const P &a) const {
    // if(y!=a.y)
    return y > a.y;
  };
};

int a, b, c, d, i, k, n, m, e, dx[10] = {1, 0, -1, 0, 1, 1, -1, -1},
                               dy[10] = {0, 1, 0, -1, 1, -1, 1, -1};
int o[100101];
long long l[101015];
long long j[100101][2];

long long x, y, z, mod = 1000000007;
string r;
// char r[2];

P u[1];
queue<int> q;
stack<int> s;
// set<int> s;
map<int, int> p;

vector<int> v;

bool as(P a, P b) { return a.x < b.x; }

void g2(int n, int m, int k) {
  l[n] += k;
  l[m + 1] -= k;
}

void f2(int n, int m, int k) {
  if (n <= m)
    g2(n, m, k);
  else
    g2(n, m + a, k); // g2(n,a-1,k),g2(0,m,k);
}

void g1(int n, int m) {
  l[n] += m - n + 2;
  l[m + 1] -= m - n + 2;
  j[n][0]--;
  j[m + 1][0]++;
  j[m + 1][1] += m - n + 1;
}

void f1(int n, int m) {
  if (n <= m)
    g1(n, m);
  else {
    // g1(n,a-1);
    // g1(0,m);
    g1(n, m + a);
  }
}

int main() {
  scanf("%d %d", &b, &a);

  for (int t = 1; t <= b; o[t]--, t++)
    scanf("%d", &o[t]);
  for (int t = 2; t <= b; t++) {
    if (o[t - 1] != o[t]) {
      f1((o[t - 1] + 1) % a, o[t]);
      f2((o[t] + 1) % a, o[t - 1], (o[t] - o[t - 1] + a) % a);
    }
  }
  x = mod * mod;
  j[0][1] += j[0][0];
  for (int t = 1; t < a * 2; t++)
    l[t] += l[t - 1], j[t][0] += j[t - 1][0],
        j[t][1] = j[t][1] + j[t - 1][1] + j[t][0];
  for (int t = 0; t < a; t++) {
    // printf("%lld %lld\n",l[t],l[t+a]);
    x = min(x, l[t] + j[t][1] + l[t + a] + j[t + a][1]);
    // printf("%lld ",l[t]+j[t][1]+l[t+a]+j[t+a][1]);
    // printf("%lld ",j[t][1]+j[t+a][1]);
  }
  printf("%lld", x);
}
// 14


Fixed submission:
#include <bits/stdc++.h>
#define pi 3.1415926535897932384626
using namespace std;

struct P {
  int x, y;
  bool operator<(const P &a) const {
    // if(y!=a.y)
    return y > a.y;
  };
};

int a, b, c, d, i, k, n, m, e, dx[10] = {1, 0, -1, 0, 1, 1, -1, -1},
                               dy[10] = {0, 1, 0, -1, 1, -1, 1, -1};
int o[200101];
long long l[201015];
long long j[200101][2];

long long x, y, z, mod = 1000000007;
string r;
// char r[2];

P u[1];
queue<int> q;
stack<int> s;
// set<int> s;
map<int, int> p;

vector<int> v;

bool as(P a, P b) { return a.x < b.x; }

void g2(int n, int m, int k) {
  l[n] += k;
  l[m + 1] -= k;
}

void f2(int n, int m, int k) {
  if (n <= m)
    g2(n, m, k);
  else
    g2(n, m + a, k); // g2(n,a-1,k),g2(0,m,k);
}

void g1(int n, int m) {
  l[n] += m - n + 2;
  l[m + 1] -= m - n + 2;
  j[n][0]--;
  j[m + 1][0]++;
  j[m + 1][1] += m - n + 1;
}

void f1(int n, int m) {
  if (n <= m)
    g1(n, m);
  else {
    // g1(n,a-1);
    // g1(0,m);
    g1(n, m + a);
  }
}

int main() {
  scanf("%d %d", &b, &a);

  for (int t = 1; t <= b; o[t]--, t++)
    scanf("%d", &o[t]);
  for (int t = 2; t <= b; t++) {
    if (o[t - 1] != o[t]) {
      f1((o[t - 1] + 1) % a, o[t]);
      f2((o[t] + 1) % a, o[t - 1], (o[t] - o[t - 1] + a) % a);
    }
  }
  x = mod * mod;
  j[0][1] += j[0][0];
  for (int t = 1; t < a * 2; t++)
    l[t] += l[t - 1], j[t][0] += j[t - 1][0],
        j[t][1] = j[t][1] + j[t - 1][1] + j[t][0];
  for (int t = 0; t < a; t++) {
    // printf("%lld %lld\n",l[t],l[t+a]);
    x = min(x, l[t] + j[t][1] + l[t + a] + j[t + a][1]);
    // printf("%lld ",l[t]+j[t][1]+l[t+a]+j[t+a][1]);
    // printf("%lld ",j[t][1]+j[t+a][1]);
  }
  printf("%lld", x);
}
// 14