func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100050, inf = 1e9 + 7;   struct tree {     int l, r, mid, rx, id;   } t[N << 3];   struct node {     int l, r, t, id;     bool operator<(const node &p) const {       if (l == p.l) return id < p.id;       return l < p.l;     }   } g[N << 1];   int n, m, ans[N];   vector<int> v;   int get(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; }   void pushup(int rt) { t[rt].rx = max(t[rt << 1].rx, t[rt << 1 | 1].rx); }   void build(int l, int r, int rt) {     int m = (l + r) >> 1;     t[rt].l = l;     t[rt].r = r;     t[rt].mid = m;     if (l == r) {       t[rt].rx = -inf;       return;     }     build(l, m, rt << 1);     build(m + 1, r, rt << 1 | 1);     pushup(rt);   }   void update(int pos, int id, int x, int rt) {     if (t[rt].l == t[rt].r) {       t[rt].rx = x;       t[rt].id = id;       return;     }     if (pos <= t[rt].mid) {       update(pos, id, x, rt << 1);     }     if (pos > t[rt].mid) {       update(pos, id, x, rt << 1 | 1);     }     pushup(rt);   }   int query(int pos, int x, int rt) {     if (t[rt].rx < x) return -1;     if (t[rt].l == t[rt].r) return t[rt].id;     int ans = -1;     if (pos <= t[rt].mid) {       ans = query(pos, x, rt << 1);       if (ans > 0) return ans;     }     return query(pos, x, rt << 1 | 1);   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n + m; i++) {       scanf( %d%d%d , &g[i].l, &g[i].r, &g[i].t);       g[i].id = i;       v.push_back(g[i].t);     }     sort(v.begin(), v.end());     v.erase(unique(v.begin(), v.end()), v.end());     build(1, v.size(), 1);     sort(g + 1, g + n + m + 1);     for (int i = 1; i <= n + m; i++) {       int pos = get(g[i].t);       if (g[i].id <= n) {         update(pos, g[i].id, g[i].r, 1);       } else {         ans[g[i].id - n] = query(pos, g[i].r, 1);       }     }     for (int i = 1; i <= m; i++) {       printf( %d  , ans[i]);     }     return 0;   }   