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
| #include <algorithm> #include <iostream> #include <cstdio> #include <set> using namespace std; typedef pair<int,int> par; int n, m, uu, vv, tot, fa[400005][19], ans[400005]; const int oo=0x3f3f3f3f; set<par> se; struct Node{ int l, r, id; }nd[400005]; bool cmp(Node x, Node y){ return x.l<y.l; } int solve(int x){ int re=0, lim=nd[x].l+m; for(int i=18; i>=0; i--) if(fa[x][i] && nd[fa[x][i]].l<lim){ x = fa[x][i]; re += 1<<i; } return re; } int main(){ cin>>n>>m; for(int i=1; i<=n; i++){ scanf("%d %d", &uu, &vv); if(vv<uu) vv += m; nd[++tot] = (Node){uu, vv, i}; nd[++tot] = (Node){uu+m, vv+m, 0}; } sort(nd+1, nd+1+tot, cmp); se.insert(par(nd[tot].l, tot)); for(int i=tot-1; i; i--){ fa[i][0] = (--se.upper_bound(par(nd[i].r, oo)))->second; se.insert(par(nd[i].l, i)); } for(int i=1; i<=18; i++) for(int j=1; j<=tot; j++) fa[j][i] = fa[fa[j][i-1]][i-1]; for(int i=1; i<=tot; i++) if(nd[i].id) ans[nd[i].id] = solve(i) + 1; for(int i=1; i<=n; i++) printf("%d ", ans[i]); printf("\n"); return 0; }
|