1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; const int N = 2 * (2e5 + 5);
template <typename _Tp> void read(_Tp &a, char c = 0) { for (c = getchar(); !isdigit(c); c = getchar()); for (a = 0; isdigit(c); a = a * 10 + c - '0', c = getchar()); }
int n, m, _n, _m;
class seg { public: int l, r, nxt, id; seg() {} seg(int _l, int _r, int _id) { l = _l; r = _r; nxt = -1; id = _id; } void print() { printf("[%d, %d] -> %d\n", l, r, nxt); } bool operator < (const seg &o) const { return l < o.l; } ~seg() {} };
seg a[N];
int f[N][20], pz[N];
void print() { for (int i = 1; i <= n; i++) { a[i].print(); } }
#define DEBUG
int main() { read(n), read(m); _n = n * 2; _m = m * 2; for (int i = 1; i <= n; i++) { int l, r; read(l), read(r); if (r < l) r += m; a[i] = seg(l, r, i); } sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { a[i + n] = a[i]; a[i + n].l = a[i].l + m; a[i + n].r = a[i].r + m; } int p1 = 1, p2 = 1; while (p1 <= _n) { int cr = a[p1].r; while (a[p2].l <= cr && p2 <= _n) { p2++; } a[p1].nxt = p2 - 1; f[p1][0] = p2 - 1; p1++; } for (int j = 1; j < 20; j++) { for (int i = 1; i <= _n; i++) { f[i][j] = f[f[i][j - 1]][j - 1]; } } for (int i = 1; i <= n; i++) { seg &u = a[i], v = a[i]; int p = i; int ans = 1; for (int j = 19; j >= 0; j--) { int to = f[p][j]; if (to) { v = a[to]; if (v.r < u.l + m) { p = to; ans += 1 << j; } } } pz[a[i].id] = ans + 1; } for (int i = 1; i <= n; i++) { printf("%d ", pz[i]); } puts(""); return 0; }
|