Problem p03033 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pi;
const int MAXN = 200005;
const int MOD = 1000000007;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define DEC(i, a, b) for (int i = (a); i >= (b); i--)
#define fst first
#define snd second
#define pb push_back
#define all(v) (v).begin(), (v).end()
#define sz(v) ((int)(v).size())
#define db(x) cerr << #x << " = " << x << "\n"
#define LOW(v, x) (lower_bound(all(v), (x)) - (v).begin())

int N, Q;
int X[MAXN], S[MAXN], T[MAXN];
struct node {
  int l, r;
  int v = INT_MAX;
} t[50 * MAXN];
int idx = 1;
void cchild(int id) {
  if (t[id].l == 0)
    t[id].l = ++idx;
  if (t[id].r == 0)
    t[id].r = ++idx;
}
void selfupd(int id, int v) { t[id].v = min(t[id].v, v); }
void prop(int id) {
  if (t[id].l != 0)
    selfupd(t[id].l, t[id].v);
  if (t[id].r != 0)
    selfupd(t[id].r, t[id].v);
}
void upd(int id, int s, int e, int x, int y, int v) {
  if (s == x && e == y) {
    t[id].v = min(t[id].v, v);
    return;
  }
  int m = (s + e) >> 1;
  cchild(id);
  prop(id);
  if (x <= m)
    upd(t[id].l, s, m, x, min(m, y), v);
  if (y > m)
    upd(t[id].r, m + 1, e, max(m + 1, x), y, v);
}
int query(int id, int s, int e, int x) {
  if (s == x && e == x) {
    return t[id].v;
  }
  int m = (s + e) >> 1;
  cchild(id);
  prop(id);
  if (x <= m)
    return query(t[id].l, s, m, x);
  else
    return query(t[id].r, m + 1, e, x);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  cin >> N >> Q;
  typedef tuple<int, int, int> ti;
  vector<ti> vec;
  FOR(i, 1, N) {
    int s, t, x;
    cin >> s >> t >> x;
    s -= x;
    t -= x;
    --t;
    s = max(s, 0);
    t = max(t, 0);
    vec.pb(ti(x, s, t));
  }
  //~ sort(all(vec));
  FOR(i, 1, N) tie(X[i], S[i], T[i]) = vec[i - 1];
  //~ FOR(i,1,N)cout<<X[i]<<' '<<S[i]<<' '<<T[i]<<"\n";
  FOR(i, 1, N) { upd(1, 0, 1e9, S[i], T[i], X[i]); }
  while (Q--) {
    int d;
    cin >> d;
    int tmp = query(1, 0, 1e9, d);
    if (tmp == INT_MAX)
      tmp = -1;
    cout << tmp << "\n";
  }
}
/*
 */


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pi;
const int MAXN = 200005;
const int MOD = 1000000007;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define DEC(i, a, b) for (int i = (a); i >= (b); i--)
#define fst first
#define snd second
#define pb push_back
#define all(v) (v).begin(), (v).end()
#define sz(v) ((int)(v).size())
#define db(x) cerr << #x << " = " << x << "\n"
#define LOW(v, x) (lower_bound(all(v), (x)) - (v).begin())

int N, Q;
int X[MAXN], S[MAXN], T[MAXN];
struct node {
  int l, r;
  int v = INT_MAX;
} t[200 * MAXN];
int idx = 1;
void cchild(int id) {
  if (t[id].l == 0)
    t[id].l = ++idx;
  if (t[id].r == 0)
    t[id].r = ++idx;
}
void selfupd(int id, int v) { t[id].v = min(t[id].v, v); }
void prop(int id) {
  if (t[id].l != 0)
    selfupd(t[id].l, t[id].v);
  if (t[id].r != 0)
    selfupd(t[id].r, t[id].v);
}
void upd(int id, int s, int e, int x, int y, int v) {
  if (s == x && e == y) {
    t[id].v = min(t[id].v, v);
    return;
  }
  int m = (s + e) >> 1;
  cchild(id);
  prop(id);
  if (x <= m)
    upd(t[id].l, s, m, x, min(m, y), v);
  if (y > m)
    upd(t[id].r, m + 1, e, max(m + 1, x), y, v);
}
int query(int id, int s, int e, int x) {
  if (s == x && e == x) {
    return t[id].v;
  }
  int m = (s + e) >> 1;
  cchild(id);
  prop(id);
  if (x <= m)
    return query(t[id].l, s, m, x);
  else
    return query(t[id].r, m + 1, e, x);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  cin >> N >> Q;
  typedef tuple<int, int, int> ti;
  vector<ti> vec;
  FOR(i, 1, N) {
    int s, t, x;
    cin >> s >> t >> x;
    s -= x;
    t -= x;
    --t;
    s = max(s, 0);
    t = max(t, 0);
    vec.pb(ti(x, s, t));
  }
  //~ sort(all(vec));
  FOR(i, 1, N) tie(X[i], S[i], T[i]) = vec[i - 1];
  //~ FOR(i,1,N)cout<<X[i]<<' '<<S[i]<<' '<<T[i]<<"\n";
  FOR(i, 1, N) { upd(1, 0, 1e9, S[i], T[i], X[i]); }
  while (Q--) {
    int d;
    cin >> d;
    int tmp = query(1, 0, 1e9, d);
    if (tmp == INT_MAX)
      tmp = -1;
    cout << tmp << "\n";
  }
}
/*
 */