Problem p03279 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <iostream>
#define int long long
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
const int N = 1e6 + 100, mod = 1e9 + 7;
int n, m, cnt, top, a[N], b[N];
int f[N], tr[N];
int S[N];
struct node {
  int x, y;
  int friend operator==(node a, node b) { return a.x == b.x && a.y == b.y; }
} p[N];
int lowbit(int x) { return x & -x; }
int cmp(node a, node b) {
  if (a.x != b.x)
    return a.x < b.x;
  return a.y > b.y;
}
int ask(int x) {
  int res = 0;
  for (; x; x -= lowbit(x))
    res = (res + tr[x]) % mod;
  return res;
}
void add(int x, int v) {
  for (; x <= top; x += lowbit(x))
    tr[x] = (tr[x] + v) % mod;
}
signed main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++)
    a[i] = read();
  for (int i = 1; i <= m; i++)
    b[i] = read();
  for (int i = 1; i <= n; i++) {
    if (a[i] <= b[1] || a[i] >= b[m])
      continue;
    int t = lower_bound(b + 1, b + 1 + m, a[i]) - b;
    if (b[t] == a[i])
      continue;
    p[++cnt] = node{a[i] - b[t - 1], b[t] - a[i]};
    S[++top] = b[t] - a[i];
  }
  sort(S + 1, S + 1 + top);
  top = unique(S + 1, S + 1 + top) - S - 1;
  for (int i = 1; i <= top; i++)
    p[i].y = lower_bound(S + 1, S + 1 + top, p[i].y) - S;
  sort(p + 1, p + 1 + cnt, cmp);
  cnt = unique(p + 1, p + 1 + cnt) - p - 1;
  f[0] = 1;
  for (int i = 1; i <= cnt; i++) {
    f[i] = ask(p[i].y - 1) + 1;
    add(p[i].y, f[i]);
  }
  int ans = 0;
  for (int i = 0; i <= cnt; i++)
    ans = (ans + f[i]) % mod;
  cout << ans << "\n";
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <iostream>
#define int long long
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
const int N = 1e6 + 100, mod = 1e9 + 7;
int n, m, cnt, top, a[N], b[N];
int f[N], tr[N];
int S[N];
struct node {
  int x, y;
  int friend operator==(node a, node b) { return a.x == b.x && a.y == b.y; }
} p[N];
int lowbit(int x) { return x & -x; }
int cmp(node a, node b) {
  if (a.x != b.x)
    return a.x < b.x;
  return a.y > b.y;
}
int ask(int x) {
  int res = 0;
  for (; x; x -= lowbit(x))
    res = (res + tr[x]) % mod;
  return res;
}
void add(int x, int v) {
  for (; x <= top; x += lowbit(x))
    tr[x] = (tr[x] + v) % mod;
}
signed main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++)
    a[i] = read();
  for (int i = 1; i <= m; i++)
    b[i] = read();
  for (int i = 1; i <= n; i++) {
    if (a[i] <= b[1] || a[i] >= b[m])
      continue;
    int t = lower_bound(b + 1, b + 1 + m, a[i]) - b;
    if (b[t] == a[i])
      continue;
    p[++cnt] = node{a[i] - b[t - 1], b[t] - a[i]};
    S[++top] = b[t] - a[i];
  }
  sort(S + 1, S + 1 + top);
  top = unique(S + 1, S + 1 + top) - S - 1;
  for (int i = 1; i <= cnt; i++)
    p[i].y = lower_bound(S + 1, S + 1 + top, p[i].y) - S;
  sort(p + 1, p + 1 + cnt, cmp);
  cnt = unique(p + 1, p + 1 + cnt) - p - 1;
  f[0] = 1;
  for (int i = 1; i <= cnt; i++) {
    f[i] = ask(p[i].y - 1) + 1;
    add(p[i].y, f[i]);
  }
  int ans = 0;
  for (int i = 0; i <= cnt; i++)
    ans = (ans + f[i]) % mod;
  cout << ans << "\n";
}