Problem p03709 (C++)

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

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef double lf;
typedef long double llf;
typedef std::pair<int, int> pii;

#define xx first
#define yy second

template <typename T> inline T max(T a, T b) { return a > b ? a : b; }
template <typename T> inline T min(T a, T b) { return a < b ? a : b; }
template <typename T> inline T abs(T a) { return a > 0 ? a : -a; }
template <typename T> inline bool repr(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T> inline bool repl(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T> inline T gcd(T a, T b) {
  T t;
  if (a < b) {
    while (a) {
      t = a;
      a = b % a;
      b = t;
    }
    return b;
  } else {
    while (b) {
      t = b;
      b = a % b;
      a = t;
    }
    return a;
  }
}
template <typename T> inline T sqr(T x) { return x * x; }
#define mp(a, b) std::make_pair(a, b)
#define pb push_back
#define I inline
#define mset(a, b) memset(a, b, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(a))

#define fo0(i, n) for (int i = 0, i##end = n; i < i##end; i++)
#define fo1(i, n) for (int i = 1, i##end = n; i <= i##end; i++)
#define fo(i, a, b) for (int i = a, i##end = b; i <= i##end; i++)
#define fd0(i, n) for (int i = (n)-1; ~i; i--)
#define fd1(i, n) for (int i = n; i; i--)
#define fd(i, a, b) for (int i = a, i##end = b; i >= i##end; i--)
#define foe(i, x) for (__typeof(x.end()) i = x.begin(); i != x.end(); ++i)

struct Cg {
  I char operator()() { return getchar(); }
};
struct Cp {
  I void operator()(char x) { putchar(x); }
};
#define OP operator
#define RT return *this;
#define RX                                                                     \
  x = 0;                                                                       \
  char t = P();                                                                \
  while ((t < '0' || t > '9') && t != '-')                                     \
    t = P();                                                                   \
  bool f = 0;                                                                  \
  if (t == '-')                                                                \
    t = P(), f = 1;                                                            \
  x = t - '0';                                                                 \
  for (t = P(); t >= '0' && t <= '9'; t = P())                                 \
  x = x * 10 + t - '0'
#define RL                                                                     \
  if (t == '.') {                                                              \
    lf u = 0.1;                                                                \
    for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1)                     \
      x += u * (t - '0');                                                      \
  }                                                                            \
  if (f)                                                                       \
  x = -x
#define RU                                                                     \
  x = 0;                                                                       \
  char t = P();                                                                \
  while (t < '0' || t > '9')                                                   \
    t = P();                                                                   \
  x = t - '0';                                                                 \
  for (t = P(); t >= '0' && t <= '9'; t = P())                                 \
  x = x * 10 + t - '0'
#define TR                                                                     \
  *this, x;                                                                    \
  return x;
I bool IS(char x) { return x == 10 || x == 13 || x == ' '; }
template <typename T> struct Fr {
  T P;
  I Fr &OP, (int &x) {
    RX;
    if (f)
      x = -x;
    RT
  }
  I OP int() {
    int x;
    TR
  }
  I Fr &OP, (ll & x) {
    RX;
    if (f)
      x = -x;
    RT
  }
  I OP ll() {
    ll x;
    TR
  }
  I Fr &OP, (char &x) {
    for (x = P(); IS(x); x = P())
      ;
    RT
  }
  I OP char() {
    char x;
    TR
  }
  I Fr &OP, (char *x) {
    char t = P();
    for (; IS(t); t = P())
      ;
    if (~t) {
      for (; !IS(t) && ~t; t = P())
        *x++ = t;
    }
    *x++ = 0;
    RT
  }
  I Fr &OP, (lf & x) {
    RX;
    RL;
    RT
  }
  I OP lf() {
    lf x;
    TR
  }
  I Fr &OP, (llf & x) {
    RX;
    RL;
    RT
  }
  I OP llf() {
    llf x;
    TR
  }
  I Fr &OP, (uint & x) {
    RU;
    RT
  }
  I OP uint() {
    uint x;
    TR
  }
  I Fr &OP, (ull & x) {
    RU;
    RT
  }
  I OP ull() {
    ull x;
    TR
  }
};
Fr<Cg> in;
#define WI(S)                                                                  \
  if (x) {                                                                     \
    if (x < 0)                                                                 \
      P('-'), x = -x;                                                          \
    char s[S], c = 0;                                                          \
    while (x)                                                                  \
      s[c++] = x % 10 + '0', x /= 10;                                          \
    while (c--)                                                                \
      P(s[c]);                                                                 \
  } else                                                                       \
    P('0')
#define WL                                                                     \
  if (y) {                                                                     \
    lf t = 0.5;                                                                \
    for (int i = y; i--;)                                                      \
      t *= 0.1;                                                                \
    if (x >= 0)                                                                \
      x += t;                                                                  \
    else                                                                       \
      x -= t, P('-');                                                          \
    *this, (ll)(abs(x));                                                       \
    P('.');                                                                    \
    if (x < 0)                                                                 \
      x = -x;                                                                  \
    while (y--) {                                                              \
      x *= 10;                                                                 \
      x -= floor(x * 0.1) * 10;                                                \
      P(((int)x) % 10 + '0');                                                  \
    }                                                                          \
  } else if (x >= 0)                                                           \
    *this, (ll)(x + 0.5);                                                      \
  else                                                                         \
    *this, (ll)(x - 0.5);
#define WU(S)                                                                  \
  if (x) {                                                                     \
    char s[S], c = 0;                                                          \
    while (x)                                                                  \
      s[c++] = x % 10 + '0', x /= 10;                                          \
    while (c--)                                                                \
      P(s[c]);                                                                 \
  } else                                                                       \
    P('0')
template <typename T> struct Fw {
  T P;
  I Fw &OP, (int x) {
    WI(10);
    RT
  }
  I Fw &OP()(int x) {
    WI(10);
    RT
  }
  I Fw &OP, (uint x) {
    WU(10);
    RT
  }
  I Fw &OP()(uint x) {
    WU(10);
    RT
  }
  I Fw &OP, (ll x) {
    WI(19);
    RT
  }
  I Fw &OP()(ll x) {
    WI(19);
    RT
  }
  I Fw &OP, (ull x) {
    WU(20);
    RT
  }
  I Fw &OP()(ull x) {
    WU(20);
    RT
  }
  I Fw &OP, (char x) {
    P(x);
    RT
  }
  I Fw &OP()(char x) {
    P(x);
    RT
  }
  I Fw &OP, (const char *x) {
    while (*x)
      P(*x++);
    RT
  }
  I Fw &OP()(const char *x) {
    while (*x)
      P(*x++);
    RT
  }
  I Fw &OP()(lf x, int y) {
    WL;
    RT
  }
  I Fw &OP()(llf x, int y) {
    WL;
    RT
  }
};
Fw<Cp> out;

const int N = 200007, P = 1000000007;

int n, l[N], r[N], dp[N], pre[N], v[N], f[N], flag;
pii s[N];
std::vector<int> g[N];

inline void modify(int x, int l, int r, int p, int v) {
  if (l == r) {
    f[x] = v;
  } else {
    int t = (l + r) >> 1;
    if (p <= t)
      modify(x << 1, l, t, p, v);
    else
      modify(x << 1 | 1, t + 1, r, p, v);
    f[x] = flag ? min(f[x << 1], f[x << 1 | 1]) : max(f[x << 1], f[x << 1 | 1]);
  }
}

inline int query(int x, int l, int r, int ql, int qr) {
  if (ql > qr)
    return flag ? 1e9 : -1e9;
  // out,x,' ',f[x],'\n';
  if (l >= ql && r <= qr)
    return f[x];
  int t = (l + r) >> 1;
  if (qr <= t)
    return query(x << 1, l, t, ql, qr);
  if (ql > t)
    return query(x << 1 | 1, t + 1, r, ql, qr);
  int a = query(x << 1, l, t, ql, t),
      b = query(x << 1 | 1, t + 1, r, t + 1, qr);
  return flag ? min(a, b) : max(a, b);
}

int main() {
  in, n;
  fo0(i, n) in, s[i].yy, s[i].xx;
  std::sort(s, s + n);
  fo0(i, n) v[i] = s[i].yy;
  std::sort(v, v + n);
  fo0(i, n) s[i].yy = std::lower_bound(v, v + n, s[i].yy) - v;
  mset(f, 0x7f);
  flag = 1;
  fo0(i, n) {
    int v = query(1, 0, n - 1, s[i].yy + 1, n - 1);
    // out,'/',i,' ',v,'\n';
    if (v > 1e6)
      l[i] = i;
    else
      l[i] = v;
    modify(1, 0, n - 1, s[i].yy, i);
  }
  mset(f, 0x80);
  flag = 0;
  fd0(i, n) {
    int v = query(1, 0, n - 1, 0, s[i].yy - 1);
    if (v < 0)
      r[i] = i;
    else
      r[i] = v;
    modify(1, 0, n - 1, s[i].yy, i);
  }
  // fo0(i,n)out,l[i],' ',r[i],'\n';
  fo0(i, n) g[r[i] + 2].pb(l[i]);
  dp[1] = 1;
  pre[1] = 1;
  fo(i, 2, n + 1) {
    // foe(j,g[i])out,i,' ',pre[i-1]-pre[*j],'\n';
    std::sort(g[i].begin(), g[i].end(), std::greater<int>());
    int x = 1;
    fo0(j, g[i].size()) dp[i] =
        (dp[i] + (ll)x * (pre[i - 1] - pre[g[i][j]] + P)) % P,
                        x = x * 2 % P;
    pre[i] = (pre[i - 1] + dp[i]) % P;
  }
  out, dp[n + 1], '\n';
}

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

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef double lf;
typedef long double llf;
typedef std::pair<int, int> pii;

#define xx first
#define yy second

template <typename T> inline T max(T a, T b) { return a > b ? a : b; }
template <typename T> inline T min(T a, T b) { return a < b ? a : b; }
template <typename T> inline T abs(T a) { return a > 0 ? a : -a; }
template <typename T> inline bool repr(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T> inline bool repl(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T> inline T gcd(T a, T b) {
  T t;
  if (a < b) {
    while (a) {
      t = a;
      a = b % a;
      b = t;
    }
    return b;
  } else {
    while (b) {
      t = b;
      b = a % b;
      a = t;
    }
    return a;
  }
}
template <typename T> inline T sqr(T x) { return x * x; }
#define mp(a, b) std::make_pair(a, b)
#define pb push_back
#define I inline
#define mset(a, b) memset(a, b, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(a))

#define fo0(i, n) for (int i = 0, i##end = n; i < i##end; i++)
#define fo1(i, n) for (int i = 1, i##end = n; i <= i##end; i++)
#define fo(i, a, b) for (int i = a, i##end = b; i <= i##end; i++)
#define fd0(i, n) for (int i = (n)-1; ~i; i--)
#define fd1(i, n) for (int i = n; i; i--)
#define fd(i, a, b) for (int i = a, i##end = b; i >= i##end; i--)
#define foe(i, x) for (__typeof(x.end()) i = x.begin(); i != x.end(); ++i)

struct Cg {
  I char operator()() { return getchar(); }
};
struct Cp {
  I void operator()(char x) { putchar(x); }
};
#define OP operator
#define RT return *this;
#define RX                                                                     \
  x = 0;                                                                       \
  char t = P();                                                                \
  while ((t < '0' || t > '9') && t != '-')                                     \
    t = P();                                                                   \
  bool f = 0;                                                                  \
  if (t == '-')                                                                \
    t = P(), f = 1;                                                            \
  x = t - '0';                                                                 \
  for (t = P(); t >= '0' && t <= '9'; t = P())                                 \
  x = x * 10 + t - '0'
#define RL                                                                     \
  if (t == '.') {                                                              \
    lf u = 0.1;                                                                \
    for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1)                     \
      x += u * (t - '0');                                                      \
  }                                                                            \
  if (f)                                                                       \
  x = -x
#define RU                                                                     \
  x = 0;                                                                       \
  char t = P();                                                                \
  while (t < '0' || t > '9')                                                   \
    t = P();                                                                   \
  x = t - '0';                                                                 \
  for (t = P(); t >= '0' && t <= '9'; t = P())                                 \
  x = x * 10 + t - '0'
#define TR                                                                     \
  *this, x;                                                                    \
  return x;
I bool IS(char x) { return x == 10 || x == 13 || x == ' '; }
template <typename T> struct Fr {
  T P;
  I Fr &OP, (int &x) {
    RX;
    if (f)
      x = -x;
    RT
  }
  I OP int() {
    int x;
    TR
  }
  I Fr &OP, (ll & x) {
    RX;
    if (f)
      x = -x;
    RT
  }
  I OP ll() {
    ll x;
    TR
  }
  I Fr &OP, (char &x) {
    for (x = P(); IS(x); x = P())
      ;
    RT
  }
  I OP char() {
    char x;
    TR
  }
  I Fr &OP, (char *x) {
    char t = P();
    for (; IS(t); t = P())
      ;
    if (~t) {
      for (; !IS(t) && ~t; t = P())
        *x++ = t;
    }
    *x++ = 0;
    RT
  }
  I Fr &OP, (lf & x) {
    RX;
    RL;
    RT
  }
  I OP lf() {
    lf x;
    TR
  }
  I Fr &OP, (llf & x) {
    RX;
    RL;
    RT
  }
  I OP llf() {
    llf x;
    TR
  }
  I Fr &OP, (uint & x) {
    RU;
    RT
  }
  I OP uint() {
    uint x;
    TR
  }
  I Fr &OP, (ull & x) {
    RU;
    RT
  }
  I OP ull() {
    ull x;
    TR
  }
};
Fr<Cg> in;
#define WI(S)                                                                  \
  if (x) {                                                                     \
    if (x < 0)                                                                 \
      P('-'), x = -x;                                                          \
    char s[S], c = 0;                                                          \
    while (x)                                                                  \
      s[c++] = x % 10 + '0', x /= 10;                                          \
    while (c--)                                                                \
      P(s[c]);                                                                 \
  } else                                                                       \
    P('0')
#define WL                                                                     \
  if (y) {                                                                     \
    lf t = 0.5;                                                                \
    for (int i = y; i--;)                                                      \
      t *= 0.1;                                                                \
    if (x >= 0)                                                                \
      x += t;                                                                  \
    else                                                                       \
      x -= t, P('-');                                                          \
    *this, (ll)(abs(x));                                                       \
    P('.');                                                                    \
    if (x < 0)                                                                 \
      x = -x;                                                                  \
    while (y--) {                                                              \
      x *= 10;                                                                 \
      x -= floor(x * 0.1) * 10;                                                \
      P(((int)x) % 10 + '0');                                                  \
    }                                                                          \
  } else if (x >= 0)                                                           \
    *this, (ll)(x + 0.5);                                                      \
  else                                                                         \
    *this, (ll)(x - 0.5);
#define WU(S)                                                                  \
  if (x) {                                                                     \
    char s[S], c = 0;                                                          \
    while (x)                                                                  \
      s[c++] = x % 10 + '0', x /= 10;                                          \
    while (c--)                                                                \
      P(s[c]);                                                                 \
  } else                                                                       \
    P('0')
template <typename T> struct Fw {
  T P;
  I Fw &OP, (int x) {
    WI(10);
    RT
  }
  I Fw &OP()(int x) {
    WI(10);
    RT
  }
  I Fw &OP, (uint x) {
    WU(10);
    RT
  }
  I Fw &OP()(uint x) {
    WU(10);
    RT
  }
  I Fw &OP, (ll x) {
    WI(19);
    RT
  }
  I Fw &OP()(ll x) {
    WI(19);
    RT
  }
  I Fw &OP, (ull x) {
    WU(20);
    RT
  }
  I Fw &OP()(ull x) {
    WU(20);
    RT
  }
  I Fw &OP, (char x) {
    P(x);
    RT
  }
  I Fw &OP()(char x) {
    P(x);
    RT
  }
  I Fw &OP, (const char *x) {
    while (*x)
      P(*x++);
    RT
  }
  I Fw &OP()(const char *x) {
    while (*x)
      P(*x++);
    RT
  }
  I Fw &OP()(lf x, int y) {
    WL;
    RT
  }
  I Fw &OP()(llf x, int y) {
    WL;
    RT
  }
};
Fw<Cp> out;

const int N = 200007, P = 1000000007;

int n, l[N], r[N], dp[N], pre[N], v[N], f[1 << 19], flag;
pii s[N];
std::vector<int> g[N];

inline void modify(int x, int l, int r, int p, int v) {
  if (l == r) {
    f[x] = v;
  } else {
    int t = (l + r) >> 1;
    if (p <= t)
      modify(x << 1, l, t, p, v);
    else
      modify(x << 1 | 1, t + 1, r, p, v);
    f[x] = flag ? min(f[x << 1], f[x << 1 | 1]) : max(f[x << 1], f[x << 1 | 1]);
  }
}

inline int query(int x, int l, int r, int ql, int qr) {
  if (ql > qr)
    return flag ? 1e9 : -1e9;
  // out,x,' ',f[x],'\n';
  if (l >= ql && r <= qr)
    return f[x];
  int t = (l + r) >> 1;
  if (qr <= t)
    return query(x << 1, l, t, ql, qr);
  if (ql > t)
    return query(x << 1 | 1, t + 1, r, ql, qr);
  int a = query(x << 1, l, t, ql, t),
      b = query(x << 1 | 1, t + 1, r, t + 1, qr);
  return flag ? min(a, b) : max(a, b);
}

int main() {
  in, n;
  fo0(i, n) in, s[i].yy, s[i].xx;
  std::sort(s, s + n);
  fo0(i, n) v[i] = s[i].yy;
  std::sort(v, v + n);
  fo0(i, n) s[i].yy = std::lower_bound(v, v + n, s[i].yy) - v;
  mset(f, 0x7f);
  flag = 1;
  fo0(i, n) {
    int v = query(1, 0, n - 1, s[i].yy + 1, n - 1);
    // out,'/',i,' ',v,'\n';
    if (v > 1e6)
      l[i] = i;
    else
      l[i] = v;
    modify(1, 0, n - 1, s[i].yy, i);
  }
  mset(f, 0x80);
  flag = 0;
  fd0(i, n) {
    int v = query(1, 0, n - 1, 0, s[i].yy - 1);
    if (v < 0)
      r[i] = i;
    else
      r[i] = v;
    modify(1, 0, n - 1, s[i].yy, i);
  }
  // fo0(i,n)out,l[i],' ',r[i],'\n';
  fo0(i, n) g[r[i] + 2].pb(l[i]);
  dp[1] = 1;
  pre[1] = 1;
  fo(i, 2, n + 1) {
    // foe(j,g[i])out,i,' ',pre[i-1]-pre[*j],'\n';
    std::sort(g[i].begin(), g[i].end(), std::greater<int>());
    int x = 1;
    fo0(j, g[i].size()) dp[i] =
        (dp[i] + (ll)x * (pre[i - 1] - pre[g[i][j]] + P)) % P,
                        x = x * 2 % P;
    pre[i] = (pre[i - 1] + dp[i]) % P;
  }
  out, dp[n + 1], '\n';
}