Problem p03790 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
int n, k;
struct treaps {
  int son[400010][2], num[400010], size[400010], ran[400010];
  long long dl[400010], dr[400010];
  int tt;
  long long getl(int root) {
    while (son[root][0])
      root = son[root][0];
    return dl[root];
  }
  long long getmin(int root) {
    long long ans = dr[root];
    if (son[root][0])
      ans = min(ans, getmin(son[root][0]));
    if (son[root][1])
      ans = min(ans, getmin(son[root][1]));
    return ans;
  }
  int newnode(int num_, int size_, long long dl_, long long dr_) {
    tt++;
    son[tt][0] = son[tt][1] = 0;
    ran[tt] = rand();
    num[tt] = num_;
    size[tt] = size_;
    dl[tt] = dl_;
    dr[tt] = dr_;
    return tt;
  }
  int merge(int s, int t) {
    if (!s)
      return t;
    if (!t)
      return s;
    if (ran[s] > ran[t]) {
      size[s] += size[t];
      son[s][1] = merge(son[s][1], t);
      return s;
    } else {
      size[t] += size[s];
      son[t][0] = merge(s, son[t][0]);
      return t;
    }
  }
  pair<int, int> split(int root, int k) {
    if (!root)
      return make_pair(0, 0);
    if (k <= size[son[root][0]]) {
      pair<int, int> p = split(son[root][0], k);
      son[root][0] = p.second;
      size[root] = size[son[root][0]] + size[son[root][1]] + num[root];
      return make_pair(p.first, root);
    }
    if (k >= size[son[root][0]] + num[root]) {
      pair<int, int> p =
          split(son[root][1], k - size[son[root][0]] - num[root]);
      son[root][1] = p.first;
      size[root] = size[son[root][0]] + size[son[root][1]] + num[root];
      return make_pair(root, p.second);
    }
    k -= size[son[root][0]];
    int a = newnode(k, k, dl[root], dl[root]),
        b = newnode(num[root] - k, num[root] - k, dr[root], dr[root]);
    if (dl[root] > dr[root]) {
      dr[a] = dl[root] - k + 1;
      dl[b] = dl[root] - k;
    }
    return make_pair(merge(son[root][0], a), merge(b, son[root][1]));
  }
} treap;
int main() {
  scanf("%d%d", &n, &k);
  long long sum = 0;
  int root = treap.newnode(k, k, 0, 0);
  for (int i = 1; i <= n; i++) {
    int len, tp;
    scanf("%d%d", &len, &tp);
    sum += len;
    if (tp == 1) {
      if (len * 2 > k) {
        puts("-1");
        return 0;
      }
      pair<int, int> p = treap.split(root, 1),
                     q = treap.split(p.second, len * 2 - 1);
      q.second = treap.merge(q.second, p.first);
      long long y = treap.getl(q.second);
      root = treap.merge(q.second, treap.newnode(len * 2 - 1, len * 2 - 1,
                                                 y + len * 2 - 1, y + 1));
    } else {
      pair<int, int> p = treap.split(root, len * 2 % k);
      root = treap.merge(p.second, p.first);
    }
  }
  printf("%lld\n", sum * 2 + treap.getmin(root));
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
int n, k;
struct treaps {
  int son[1000100][2], num[1000100], size[1000100], ran[1000100];
  long long dl[1000100], dr[1000100];
  int tt;
  long long getl(int root) {
    while (son[root][0])
      root = son[root][0];
    return dl[root];
  }
  long long getmin(int root) {
    long long ans = dr[root];
    if (son[root][0])
      ans = min(ans, getmin(son[root][0]));
    if (son[root][1])
      ans = min(ans, getmin(son[root][1]));
    return ans;
  }
  int newnode(int num_, int size_, long long dl_, long long dr_) {
    tt++;
    son[tt][0] = son[tt][1] = 0;
    ran[tt] = rand();
    num[tt] = num_;
    size[tt] = size_;
    dl[tt] = dl_;
    dr[tt] = dr_;
    return tt;
  }
  int merge(int s, int t) {
    if (!s)
      return t;
    if (!t)
      return s;
    if (ran[s] > ran[t]) {
      size[s] += size[t];
      son[s][1] = merge(son[s][1], t);
      return s;
    } else {
      size[t] += size[s];
      son[t][0] = merge(s, son[t][0]);
      return t;
    }
  }
  pair<int, int> split(int root, int k) {
    if (!root)
      return make_pair(0, 0);
    if (k <= size[son[root][0]]) {
      pair<int, int> p = split(son[root][0], k);
      son[root][0] = p.second;
      size[root] = size[son[root][0]] + size[son[root][1]] + num[root];
      return make_pair(p.first, root);
    }
    if (k >= size[son[root][0]] + num[root]) {
      pair<int, int> p =
          split(son[root][1], k - size[son[root][0]] - num[root]);
      son[root][1] = p.first;
      size[root] = size[son[root][0]] + size[son[root][1]] + num[root];
      return make_pair(root, p.second);
    }
    k -= size[son[root][0]];
    int a = newnode(k, k, dl[root], dl[root]),
        b = newnode(num[root] - k, num[root] - k, dr[root], dr[root]);
    if (dl[root] > dr[root]) {
      dr[a] = dl[root] - k + 1;
      dl[b] = dl[root] - k;
    }
    return make_pair(merge(son[root][0], a), merge(b, son[root][1]));
  }
} treap;
int main() {
  scanf("%d%d", &n, &k);
  long long sum = 0;
  int root = treap.newnode(k, k, 0, 0);
  for (int i = 1; i <= n; i++) {
    int len, tp;
    scanf("%d%d", &len, &tp);
    sum += len;
    if (tp == 1) {
      if (len * 2 > k) {
        puts("-1");
        return 0;
      }
      pair<int, int> p = treap.split(root, 1),
                     q = treap.split(p.second, len * 2 - 1);
      q.second = treap.merge(q.second, p.first);
      long long y = treap.getl(q.second);
      root = treap.merge(q.second, treap.newnode(len * 2 - 1, len * 2 - 1,
                                                 y + len * 2 - 1, y + 1));
    } else {
      pair<int, int> p = treap.split(root, len * 2 % k);
      root = treap.merge(p.second, p.first);
    }
  }
  printf("%lld\n", sum * 2 + treap.getmin(root));
}