Problem p03736 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 200200;
const ll oo = 1000000000000000000ll;
int i, j, k, n, m, ch, a, b;
ll sum, ans;
int x[N];
struct tree {
  ll v0, v1;
} T[N << 2];
void R(int &x) {
  x = 0;
  ch = getchar();
  while (ch < '0' || '9' < ch)
    ch = getchar();
  while ('0' <= ch && ch <= '9')
    x = x * 10 + ch - '0', ch = getchar();
}
void W(ll x) {
  if (x < 0)
    putchar('-'), x = -x;
  if (x >= 10)
    W(x / 10);
  putchar(x % 10 + '0');
}
void up(int k) {
  T[k].v0 = min(T[k << 1].v0, T[k << 1 | 1].v0);
  T[k].v1 = min(T[k << 1].v1, T[k << 1 | 1].v1);
}
void T_build(int L, int R, int k) {
  if (L == R) {
    T[k].v0 = T[k].v1 = oo;
    return;
  }
  int mid = (L + R) >> 1;
  T_build(L, mid, k << 1);
  T_build(mid + 1, R, k << 1 | 1);
  up(k);
}
void T_add(int L, int R, int x, ll y, int k) {
  if (L == R) {
    T[k].v0 = min(T[k].v0, y - L);
    T[k].v1 = min(T[k].v1, y + L);
    return;
  }
  int mid = (L + R) >> 1;
  if (x <= mid)
    T_add(L, mid, x, y, k << 1);
  else
    T_add(mid + 1, R, x, y, k << 1 | 1);
  up(k);
}
ll T_min0(int L, int R, int l, int r, int k) {
  if (L == l && R == r)
    return T[k].v0;
  int mid = (L + R) >> 1;
  if (r <= mid)
    return T_min0(L, mid, l, r, k << 1);
  if (l > mid)
    return T_min0(mid + 1, R, l, r, k << 1 | 1);
  return min(T_min0(L, mid, l, mid, k << 1),
             T_min0(mid + 1, R, mid + 1, r, k << 1 | 1));
}
ll T_min1(int L, int R, int l, int r, int k) {
  if (L == l && R == r)
    return T[k].v1;
  int mid = (L + R) >> 1;
  if (r <= mid)
    return T_min1(L, mid, l, r, k << 1);
  if (l > mid)
    return T_min1(mid + 1, R, l, r, k << 1 | 1);
  return min(T_min1(L, mid, l, mid, k << 1),
             T_min1(mid + 1, R, mid + 1, r, k << 1 | 1));
}
void T_bl(int L, int R, int k) {
  if (L == R) {
    ans = min(ans, T[k].v0 + L + sum);
    return;
  }
  int mid = (L + R) >> 1;
  T_bl(L, mid, k << 1);
  T_bl(mid + 1, R, k << 1 | 1);
}
int main() {
  R(n);
  R(m);
  R(a);
  R(b);
  T_build(1, n, 1);
  for (i = 1; i <= m; i++)
    R(x[i]);
  T_add(1, n, a, (ll)abs(x[1] - b) - sum, 1);
  T_add(1, n, b, (ll)abs(x[1] - a) - sum, 1);
  for (i = 2; i <= m; i++) {
    ll t0 = T_min0(1, n, 1, x[i], 1) + sum + x[i];
    ll t1 = T_min1(1, n, x[i], n, 1) + sum - x[i];
    ll t = min(t0, t1);
    sum += abs(x[i] - x[i - 1]);
    T_add(1, n, x[i - 1], t - sum, 1);
    ans = oo;
    T_bl(1, n, 1);
  }
  ans = oo;
  T_bl(1, n, 1);
  W(ans);
  puts("");
}

Fixed submission:
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 200200;
const ll oo = 1000000000000000000ll;
int i, j, k, n, m, ch, a, b;
ll sum, ans;
int x[N];
struct tree {
  ll v0, v1;
} T[N << 2];
void R(int &x) {
  x = 0;
  ch = getchar();
  while (ch < '0' || '9' < ch)
    ch = getchar();
  while ('0' <= ch && ch <= '9')
    x = x * 10 + ch - '0', ch = getchar();
}
void W(ll x) {
  if (x < 0)
    putchar('-'), x = -x;
  if (x >= 10)
    W(x / 10);
  putchar(x % 10 + '0');
}
void up(int k) {
  T[k].v0 = min(T[k << 1].v0, T[k << 1 | 1].v0);
  T[k].v1 = min(T[k << 1].v1, T[k << 1 | 1].v1);
}
void T_build(int L, int R, int k) {
  if (L == R) {
    T[k].v0 = T[k].v1 = oo;
    return;
  }
  int mid = (L + R) >> 1;
  T_build(L, mid, k << 1);
  T_build(mid + 1, R, k << 1 | 1);
  up(k);
}
void T_add(int L, int R, int x, ll y, int k) {
  if (L == R) {
    T[k].v0 = min(T[k].v0, y - L);
    T[k].v1 = min(T[k].v1, y + L);
    return;
  }
  int mid = (L + R) >> 1;
  if (x <= mid)
    T_add(L, mid, x, y, k << 1);
  else
    T_add(mid + 1, R, x, y, k << 1 | 1);
  up(k);
}
ll T_min0(int L, int R, int l, int r, int k) {
  if (L == l && R == r)
    return T[k].v0;
  int mid = (L + R) >> 1;
  if (r <= mid)
    return T_min0(L, mid, l, r, k << 1);
  if (l > mid)
    return T_min0(mid + 1, R, l, r, k << 1 | 1);
  return min(T_min0(L, mid, l, mid, k << 1),
             T_min0(mid + 1, R, mid + 1, r, k << 1 | 1));
}
ll T_min1(int L, int R, int l, int r, int k) {
  if (L == l && R == r)
    return T[k].v1;
  int mid = (L + R) >> 1;
  if (r <= mid)
    return T_min1(L, mid, l, r, k << 1);
  if (l > mid)
    return T_min1(mid + 1, R, l, r, k << 1 | 1);
  return min(T_min1(L, mid, l, mid, k << 1),
             T_min1(mid + 1, R, mid + 1, r, k << 1 | 1));
}
void T_bl(int L, int R, int k) {
  if (L == R) {
    ans = min(ans, T[k].v0 + L + sum);
    return;
  }
  int mid = (L + R) >> 1;
  T_bl(L, mid, k << 1);
  T_bl(mid + 1, R, k << 1 | 1);
}
int main() {
  R(n);
  R(m);
  R(a);
  R(b);
  T_build(1, n, 1);
  for (i = 1; i <= m; i++)
    R(x[i]);
  T_add(1, n, a, (ll)abs(x[1] - b) - sum, 1);
  T_add(1, n, b, (ll)abs(x[1] - a) - sum, 1);
  for (i = 2; i <= m; i++) {
    ll t0 = T_min0(1, n, 1, x[i], 1) + sum + x[i];
    ll t1 = T_min1(1, n, x[i], n, 1) + sum - x[i];
    ll t = min(t0, t1);
    sum += abs(x[i] - x[i - 1]);
    T_add(1, n, x[i - 1], t - sum, 1);
  }
  ans = oo;
  T_bl(1, n, 1);
  W(ans);
  puts("");
}