Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef pair<int, int> pii;
- const int N = 100100;
- const int M = 1<<19;
- int n, D;
- pii vec[2][2*N];
- int pos[2][2*N];
- int dist[2][2*N];
- struct segtree {
- bitset<M> tree;
- segtree() {
- tree.set(); // all to 1
- }
- int query(int v, int tl, int tr, int r) {
- if (tree[v] == 0) return -1;
- if (tl == tr) return tl;
- int tm = (tl + tr) / 2;
- if (r <= tm) {
- return query(2*v, tl, tm, r);
- } else if (tree[2*v+1] == 1) {
- return query(2*v+1, tm+1, tr, r);
- } else {
- return query(2*v, tl, tm, tm);
- }
- }
- void update(int v, int tl, int tr, int i) {
- if (tl == tr) {
- tree[v] = 0;
- // cout << "updated leaf " << tl << " to 0\n";
- return;
- }
- int tm = (tl + tr) / 2;
- if (i <= tm) {
- update(2*v, tl, tm, i);
- } else {
- update(2*v+1, tm+1, tr, i);
- }
- tree[v] = tree[2*v] | tree[2*v+1];
- }
- } tree[2];
- int main() {
- cin.tie(0)->sync_with_stdio(false);
- #ifndef _DEBUG
- freopen("piepie.in", "r", stdin);
- freopen("piepie.out", "w", stdout);
- #endif
- cin >> n >> D;
- for (int i = 0; i < 2*n; ++i) {
- for (int j = 0; j < 2; ++j) {
- cin >> vec[j][i].first;
- vec[j][i].second = i;
- }
- }
- for (int j = 0; j < 2; ++j) {
- sort(vec[j], vec[j]+2*n);
- for (int i = 0; i < 2*n; ++i) {
- pos[j][vec[j][i].second] = i;
- }
- }
- memset(dist, -1, sizeof(dist));
- deque<tuple<int, int, int>> q;
- for (int j = 0; j < 2; ++j) {
- for (int i = 0; i < 2*n; ++i) {
- int val = vec[j][i].first;
- if (val == 0) {
- // source
- dist[j][i] = 0;
- q.emplace_front(j, i, val);
- tree[j].update(1, 0, 2*n-1, i);
- }
- }
- }
- while (!q.empty()) {
- int j, i, minval;
- tie(j, i, minval) = q.front();
- q.pop_front();
- int id = vec[j][i].second;
- // cout<<"(j="<<j<<", i="<<i<<", minval="<<minval<<", val="<<val<<", id="<<id<<")\n";
- // move up
- int p = tree[j].query(1, 0, 2*n-1, i-1);
- // cout << "if moving up p="<<p<<"\n";
- if (p != -1 && dist[j][p] == -1 && vec[j][p].first >= minval) {
- // cout << "moving up, p="<<p<<"\n";
- dist[j][p] = dist[j][i];
- q.emplace_front(j, p, minval);
- tree[j].update(1, 0, 2*n-1, p);
- }
- // move to other side
- p = pos[1-j][id];
- if (dist[1-j][p] == -1) {
- // cout << "moving side, p="<<p<<"\n";
- dist[1-j][p] = dist[j][i] + 1;
- int val_other = vec[1-j][p].first;
- q.emplace_back(1-j, p, val_other-D);
- tree[1-j].update(1, 0, 2*n-1, p);
- }
- }
- for (int id = 0; id < n; ++id) {
- int i = pos[0][id];
- cout << dist[0][i] << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement