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; }
   |