Problem p03641 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;

#define X first
#define Y second

const int MAXN = 1 << 17;

int n;
int a[MAXN];

int rev[MAXN << 1];
pii v[MAXN << 1], w[MAXN << 1];

void build(int k, int L, int R) {
  if (L == R) {
    if (L % 2 == 1) {
      v[k] = pii(a[L], L);
      w[k] = pii(MAXN, L);
    } else {
      v[k] = pii(MAXN, L);
      w[k] = pii(a[L], L);
    }
    return;
  }
  int m = (L + R) >> 1;
  build(k << 1, L, m);
  build(k << 1 | 1, m + 1, R);
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

void clear(int k) {
  if (rev[k]) {
    rev[k << 1] ^= 1;
    swap(v[k << 1], w[k << 1]);
    rev[k << 1 | 1] ^= 1;
    swap(v[k << 1 | 1], w[k << 1 | 1]);
    rev[k] = 0;
  }
}

pii get(int k, int L, int R, int x, int y) {
  if (L == x && R == y)
    return w[k];
  clear(k);
  int m = (L + R) >> 1;
  if (y <= m)
    return get(k << 1, L, m, x, y);
  if (x > m)
    return get(k << 1 | 1, m + 1, R, x, y);
  return min(get(k << 1, L, m, x, m), get(k << 1 | 1, m + 1, R, m + 1, y));
}

void del(int k, int L, int R, int x) {
  if (L == R) {
    v[k] = pii(MAXN, L);
    w[k] = pii(MAXN, L);
    return;
  }
  clear(k);
  int m = (L + R) >> 1;
  if (x <= m)
    del(k << 1, L, m, x);
  else
    del(k << 1 | 1, m + 1, R, x);
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

void pat(int k, int L, int R, int x, int y) {
  if (L == x && R == y) {
    rev[k] ^= 1;
    swap(v[k], w[k]);
    return;
  }
  clear(k);
  int m = (L + R) >> 1;
  if (y <= m)
    pat(k << 1, L, m, x, y);
  else if (x > m)
    pat(k << 1 | 1, m + 1, R, x, y);
  else {
    pat(k << 1, L, m, x, m);
    pat(k << 1 | 1, m + 1, R, m + 1, y);
  }
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

int main() {

  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  build(1, 1, n);
  set<int> H;
  H.insert(n + 1);
  for (int i = 1; i <= n / 2; ++i) {
    pii px = v[1];
    auto it = H.upper_bound(px.Y);
    pii py = get(1, 1, n, px.Y + 1, *it - 1);
    printf("%d %d ", px.X, py.X);
    del(1, 1, n, px.Y);
    H.insert(px.Y);
    del(1, 1, n, py.Y);
    H.insert(py.Y);
    pat(1, 1, n, px.Y, py.Y);
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;

#define X first
#define Y second

const int MAXN = 1 << 18;

int n;
int a[MAXN];

int rev[MAXN << 1];
pii v[MAXN << 1], w[MAXN << 1];

void build(int k, int L, int R) {
  if (L == R) {
    if (L % 2 == 1) {
      v[k] = pii(a[L], L);
      w[k] = pii(MAXN, L);
    } else {
      v[k] = pii(MAXN, L);
      w[k] = pii(a[L], L);
    }
    return;
  }
  int m = (L + R) >> 1;
  build(k << 1, L, m);
  build(k << 1 | 1, m + 1, R);
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

void clear(int k) {
  if (rev[k]) {
    rev[k << 1] ^= 1;
    swap(v[k << 1], w[k << 1]);
    rev[k << 1 | 1] ^= 1;
    swap(v[k << 1 | 1], w[k << 1 | 1]);
    rev[k] = 0;
  }
}

pii get(int k, int L, int R, int x, int y) {
  if (L == x && R == y)
    return w[k];
  clear(k);
  int m = (L + R) >> 1;
  if (y <= m)
    return get(k << 1, L, m, x, y);
  if (x > m)
    return get(k << 1 | 1, m + 1, R, x, y);
  return min(get(k << 1, L, m, x, m), get(k << 1 | 1, m + 1, R, m + 1, y));
}

void del(int k, int L, int R, int x) {
  if (L == R) {
    v[k] = pii(MAXN, L);
    w[k] = pii(MAXN, L);
    return;
  }
  clear(k);
  int m = (L + R) >> 1;
  if (x <= m)
    del(k << 1, L, m, x);
  else
    del(k << 1 | 1, m + 1, R, x);
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

void pat(int k, int L, int R, int x, int y) {
  if (L == x && R == y) {
    rev[k] ^= 1;
    swap(v[k], w[k]);
    return;
  }
  clear(k);
  int m = (L + R) >> 1;
  if (y <= m)
    pat(k << 1, L, m, x, y);
  else if (x > m)
    pat(k << 1 | 1, m + 1, R, x, y);
  else {
    pat(k << 1, L, m, x, m);
    pat(k << 1 | 1, m + 1, R, m + 1, y);
  }
  v[k] = min(v[k << 1], v[k << 1 | 1]);
  w[k] = min(w[k << 1], w[k << 1 | 1]);
}

int main() {

  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  build(1, 1, n);
  set<int> H;
  H.insert(n + 1);
  for (int i = 1; i <= n / 2; ++i) {
    pii px = v[1];
    auto it = H.upper_bound(px.Y);
    pii py = get(1, 1, n, px.Y + 1, *it - 1);
    printf("%d %d ", px.X, py.X);
    del(1, 1, n, px.Y);
    H.insert(px.Y);
    del(1, 1, n, py.Y);
    H.insert(py.Y);
    pat(1, 1, n, px.Y, py.Y);
  }

  return 0;
}