#include <bits/stdc++.h>   using namespace std;   inline int read() {     char ch = getchar();     int ret = 0, f = 1;     while (ch >  9  || ch <  0 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) ret = ret * 10 + ch -  0 , ch = getchar();     return ret * f;   }   const double inf = 1e30, eps = 1e-10;   const int mx = 100005, md = 1e6;   struct P {     double x, y;     bool operator<(const P& a) const { return x == a.x ? y < a.y : x < a.x; }     bool operator==(const P& a) const {       return fabs(x - a.x) < eps && fabs(y - a.y) < eps;     }     bool operator!=(const P& a) const {       return fabs(x - a.x) > eps || fabs(y - a.y) > eps;     }     double operator*(const P& a) const { return x * a.y - y * a.x; }     P operator-(const P& a) const { return (P){x - a.x, y - a.y}; }   } t[mx], st, ed;   int f[mx], s[mx][2], rt, tot;   inline void rot(int x) {     int y = f[x], z = f[y], p = y[s][0] == x;     if (z)       z[s][z[s][1] == y] = x;     else       rt = x;     f[x] = z, f[y] = x, s[x][p][f] = y;     s[y][p ^ 1] = s[x][p], s[x][p] = y;   }   inline void spl(int x, int o = 0) {     for (int y = 0; f[x] ^ o; rot(x))       if (f[y = f[x]] ^ o) rot((s[y][0] == x) == (s[f[y]][0] == y) ? y : x);   }   inline int ins(P x) {     int cu = rt, ls = 0;     while (cu) {       if (t[cu] == x) {         spl(cu);         return cu;       }       ls = cu, cu = s[cu][t[cu] < x];     }     f[++tot] = ls, s[ls][t[ls] < x] = tot, t[tot] = x;     spl(tot);     return tot;   }   inline int fnd(P x) {     int cu = rt;     while (cu) {       if (t[cu] == x) return cu;       cu = s[cu][t[cu] < x];     }     return -1;   }   inline int pre(int id) {     spl(id);     int cu = s[rt][0];     while (s[cu][1]) cu = s[cu][1];     return cu;   }   inline int nxt(int id) {     spl(id);     int cu = s[rt][1];     while (s[cu][0]) cu = s[cu][0];     return cu;   }   inline void del(int id) {     int pr = pre(id), nx = nxt(id);     spl(pr), spl(nx, rt), s[s[rt][1]][0] = 0;   }   inline void add(P a) {     int id = ins(a);     int pr = pre(id), nx = nxt(id), ppr, nnx;     if (pr && nx && t[nx] != ed && ((t[pr] - a) * (t[nx] - a)) > 0) {       del(fnd(a));       return;     }     while (1) {       pr = pre(id);       ppr = pre(pr);       if (ppr && ((t[pr] - t[ppr]) * (a - t[ppr])) <= 0)         del(pr);       else         break;     }     while (1) {       nx = nxt(id);       nnx = nxt(nx);       if (t[nx] != ed && nnx && t[nnx] != ed && ((t[nx] - a) * (t[nnx] - a)) <= 0)         del(nx);       else         break;     }   }   inline int qry(double a) {     int cu = rt, re = 0;     t[0].x = -1;     while (cu) {       if (t[cu].x <= a + eps && t[re].x < t[cu].x) re = cu;       cu = s[cu][t[cu].x <= a + eps];     }     return re;   }   int n, ls;   double m;   int main() {     cin >> n >> m;     st = (P){0, 0}, ed = (P){inf, inf};     t[rt = tot = 1] = st;     ins(ed);     for (int i = 1; i <= n; i++) {       int op = read(), a = (ls + read()) % md + 1, b = (ls + read()) % md + 1;       if (op == 1) {         add((P){(double)a, (double)b});       } else {         double x = (double)b / a, y = (double)m / a;         int po = qry(x), nx = nxt(po);         if (fabs(t[po].x - x) < eps && t[po].y < y + eps)           ls = i, printf( YES n );         else if (t[nx] == ed)           printf( NO n );         else {           double inc =               t[po].y + (t[nx].y - t[po].y) / (t[nx].x - t[po].x) * (x - t[po].x);           if (inc <= y + eps)             ls = i, printf( YES n );           else             printf( NO n );         }       }     }     return 0;   }