// Cevapi - Djerek
// Dobro rjesenje
// Interval tree
// O(n log n)
//
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 100000;

struct Node {
  int trci[2][2];
  int cevapa[2];
  int pozicija[2];
  Node() {
    memset(trci, 0, sizeof trci);
    memset(cevapa, 0, sizeof cevapa);
    memset(pozicija, 0, sizeof pozicija);
  }
};

Node lazna(int udaljenost) {
  Node p;
  p.trci[0][0] = udaljenost;
  p.trci[0][1] = 0;
  p.trci[1][0] = 0;
  p.trci[1][1] = udaljenost;
  p.cevapa[0] = 0;
  p.cevapa[1] = 0;
  p.pozicija[0] = 0;
  p.pozicija[1] = 1;
  return p;
}

Node prava(int udaljenost, int smjer) {
  Node p;
  p.trci[smjer][smjer] = 0;
  p.trci[smjer][1-smjer] = udaljenost;
  p.trci[1-smjer][smjer] = 0;
  p.trci[1-smjer][1-smjer] = udaljenost;
  p.cevapa[smjer] = 1;
  p.cevapa[1-smjer] = 0;
  p.pozicija[smjer] = 1-smjer;
  p.pozicija[1-smjer] = 1-smjer;
  return p;
}

Node update(const Node &a, const Node &b) {
  Node p;
  for (int i=0; i<2; i++) {
    p.pozicija[i] = b.pozicija[a.pozicija[i]];
    p.cevapa[i] = a.cevapa[i]+b.cevapa[a.pozicija[i]];
    p.trci[i][0] = a.trci[i][0]+b.trci[a.pozicija[i]][0];
    p.trci[i][1] = a.trci[i][1]+b.trci[a.pozicija[i]][1];
  }
  return p;
}

struct Splav {
  int smjer;
  int udaljenost;
  int indeks;
};

bool operator< (const Splav &a, const Splav &b) {
  return a.udaljenost < b.udaljenost;
}

int n;
int l;
Splav s[MAX+1];
int gdje[MAX+1];

int size;
int offset;
Node *data;

void init() {
  size = 1;
  while (size < 2*n)
    size <<= 1;
  offset = size/2;
  data = new Node[size];
  for (int i=0; i<n-1; i++)
    data[i+offset] = lazna(s[i+1].udaljenost-s[i].udaljenost);
  for (int i=n-1; i+offset<size; i++)
    data[i+offset] = lazna(0);
  for (int i=offset-1; i>0; i--)
    data[i] = update(data[2*i], data[2*i+1]);
}

void fix(int k) {
  for (int i=k/2; i>0; i>>=1)
    data[i] = update(data[2*i], data[2*i+1]);
}

void solve() {
  for (int i=0; i<n-2; i++) {
    int udaljenost = data[gdje[i]+offset].trci[0][0];
    int smjer = s[gdje[i]].smjer;
    data[gdje[i]+offset] = prava(udaljenost, smjer);
    fix(gdje[i]+offset);
    printf("%d %d %d\n", data[1].trci[0][0], data[1].trci[0][1], data[1].cevapa[0]);
  }
}

int main() {
  scanf("%d%d", &n, &l);
  for (int i=0; i<n; i++) {
    scanf("%d%d", &s[i].smjer, &s[i].udaljenost);
    s[i].smjer--;
    s[i].indeks = i;
  }
  s[n].smjer = -1;
  s[n].udaljenost = 0;
  s[n].indeks = n;
  n++;
  s[n].smjer = -1;
  s[n].udaljenost = l;
  s[n].indeks = n;
  n++;
  sort(s, s+n);
  for (int i=0; i<n; i++)
    gdje[s[i].indeks] = i;
  init();
  solve();
  delete[] data;
  return 0;
}
