#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100010
int readint()
{
int x = 0, c;
while (!isdigit(c = getchar()));
do
x = x * 10 + c - '0';
while (isdigit(c = getchar()));
return x;
}
int n, m;
struct mimang
{
long long t;
int a, b, id;
mimang() {}
mimang(long long t, int a, int b, int id) : t(t), a(a), b(b), id(id) {}
};
bool operator <(mimang x, mimang y)
{
if (x.t != y.t)
return (x.t < y.t);
if (x.a != y.a)
return (x.a < y.a);
if (x.b != y.b)
return (x.b < y.b);
return (x.id < y.id);
}
mimang q[MAXN];
struct node
{
int sum, minpos, maxpos, l, r;
vector<int> ms;
node () {}
node(int l, int r) : l(l), r(r), sum(0), minpos(200100), maxpos(0) {}
};
node segtree[MAXN << 2];
inline void update(int x)
{
segtree[x].sum = segtree[x << 1].sum + segtree[(x << 1) | 1].sum;
segtree[x].minpos = min(segtree[x << 1].minpos, segtree[(x << 1) | 1].minpos);
segtree[x].maxpos = max(segtree[x << 1].maxpos, segtree[(x << 1) | 1].maxpos);
}
void build(int now, int l, int r)
{
segtree[now] = node(l, r);
if (l < r)
{
int mid = l + (r - l) / 2;
build(now << 1, l, mid);
build((now << 1) | 1, mid + 1, r);
}
}
int query(int now, int l, int r)
{
int nl = segtree[now].l, nr = segtree[now].r;
if (l <= nl && r >= nr)
return segtree[now].sum;
if (l > nr || r < nl)
return 0;
return query(now << 1, l, r) + query((now << 1) | 1, l, r);
}
void insert(int now, int pos, int id)
{
int nl = segtree[now].l, nr = segtree[now].r;
if (nl == nr)
{
segtree[now].sum++;
segtree[now].minpos = segtree[now].maxpos = nl;
segtree[now].ms.push_back(id);
return;
}
int mid = nl + (nr - nl) / 2;
if (pos <= mid)
insert(now << 1, pos, id);
else
insert((now << 1) | 1, pos, id);
update(now);
}
int workl(int now, int pos)
{
int nl = segtree[now].l, nr = segtree[now].r;
if (nl == nr)
return segtree[now].maxpos;
int mid = nl + (nr - nl) / 2;
if (pos <= mid)
return workl(now << 1, pos);
else
return max(workl(now << 1 | 1, pos), segtree[now << 1].maxpos);
}
int workr(int now, int pos)
{
int nl = segtree[now].l, nr = segtree[now].r;
if (nl == nr)
return segtree[now].minpos;
int mid = nl + (nr - nl) / 2;
if (pos <= mid)
return min(workr(now << 1, pos), segtree[(now << 1) | 1].minpos);
else
return workr((now << 1) | 1, pos);
}
long long now, pos;
long long time, ans[MAXN];
int cnt;
void clear(int now, int pos)
{
int nl = segtree[now].l, nr = segtree[now].r;
if (nl == nr)
{
for (int i = 0; i < (int)segtree[now].ms.size(); i++)
{
int v = segtree[now].ms[i];
if (v > 0)
insert(1, q[v].b, -v);
else
ans[q[-v].id] = time, cnt++;
}
segtree[now].ms.clear();
segtree[now] = node(pos, pos);
return;
}
int mid = nl + (nr - nl) / 2;
if (pos <= mid)
clear(now << 1, pos);
else
clear((now << 1) | 1, pos);
update(now);
}
int main()
{
freopen("sm.in", "r", stdin);
freopen("sm.out", "w", stdout);
n = readint();
m = readint();
for (int i = 1; i <= n; i++)
{
int t = readint();
int a = readint();
int b = readint();
q[i] = mimang(t, a, b, i);
}
cnt = 0, now = 1, time = 0, pos = 0;
sort(q + 1, q + n + 1);
build(1, 1, m);
while (cnt < n)
{
if (query(1, 1, m) == 0)
{
if (pos == n)
break;
time = q[pos + 1].t;
pos++;
while (pos <= n && q[pos].t == time)
{
insert(1, q[pos].a, pos);
pos++;
}
pos--;
}
else
{
int left = query(1, 1, now - 1);
int right = query(1, now + 1, m);
long long ls;
if (right >= left)
ls = workr(1, now);
else
ls = workl(1, now);
if (pos == n || time + abs(now - ls) <= q[pos + 1].t)
{
time = time + abs(now - ls);
now = ls;
clear(1, ls);
if (time == q[pos + 1].t)
{
pos++;
while (pos <= n && q[pos].t == time)
{
insert(1, q[pos].a, pos);
pos++;
}
pos--;
}
}
else
{
pos++;
if (right >= left)
now += q[pos].t - time;
else
now -= q[pos].t - time;
time = q[pos].t;
while (pos <= n && q[pos].t == time)
{
insert(1, q[pos].a, pos);
pos++;
}
pos--;
}
}
}
for (int i = 1; i <= n; i++)
printf("%lld\n", ans[i]);
return 0;
}