/*model code from joi website */
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using usize = std::size_t;
using i64 = std::int64_t;
using pair = std::pair<i64, usize>;
static constexpr usize digits = 19;
static constexpr i64 INF = 1e10;
struct p_segtree {
  p_segtree *left, *right;
  pair min;
  p_segtree() : left(), right(), min(INF, 0) {}
  p_segtree(pair min_) : left(), right(), min(min_) {}
  p_segtree(p_segtree *l, p_segtree *r)
      : left(l), right(r), min(std::min(l->min, r->min)) {}
  static p_segtree init(usize d = digits) {
    if (d == 0) {
      return {};
    }
    d -= 1;
    auto c = new p_segtree(init(d));
    return {c, c};
  }
  pair get_min(usize l, usize r, usize ll = 0, usize rr = 1 << digits) {
    if (r <= ll || rr <= l) {
      return {INF, 0};
    }
    if (l <= ll && rr <= r) {
      return min;
    }
    usize m = (ll + rr) / 2;
    return std::min(left->get_min(l, r, ll, m), right->get_min(l, r, m, rr));
  }
  p_segtree update(usize i, i64 v, usize d = digits) {
    if (d == 0) {
      return {{v, i}};
    }
    d -= 1;
    if (i >> d & 1) {
      return {left, new p_segtree(right->update(i, v, d))};
    } else {
      return {new p_segtree(left->update(i, v, d)), right};
    }
  }
};
struct compress {
  std::vector<pair> v;
  void add(pair x) { v.push_back(x); }
  void build() { std::sort(v.begin(), v.end()); }
  usize get(pair x) {
    return std::lower_bound(v.begin(), v.end(), x) - v.begin();
  }
};
struct town {
  i64 X, Y;
};
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  usize N, K;
  std::cin >> N >> K;
  std::vector<town> towns(N);
  for (auto &[X, Y] : towns) {
    std::cin >> X >> Y;
  }
  std::sort(towns.begin(), towns.end(),
            [&](const auto &l, const auto &r) { return l.X < r.X; });
  compress yc;
  for (usize i = 0; i != N; i += 1) {
    const auto &[X, Y] = towns[i];
    yc.add({Y, i});
  }
  yc.build();
  std::vector<p_segtree> u(N + 1), d(N + 1);
  u[0] = p_segtree::init();
  d[0] = p_segtree::init();
  for (usize i = 0; i != N; i += 1) {
    const auto &[X, Y] = towns[i];
    const usize pos = yc.get({Y, i});
    u[i + 1] = u[i].update(pos, -X + Y);
    d[i + 1] = d[i].update(pos, -X - Y);
  }
  std::priority_queue<pair, std::vector<pair>, std::greater<pair>> que;
  const auto push = [&](const usize i) {
    const auto &[X, Y] = towns[i];
    const usize pos = yc.get({Y, i});
    const auto [um, ui] = u[i].get_min(pos, 1 << digits);
    const auto [dm, di] = d[i].get_min(0, pos);
    if (um == INF && dm == INF) {
      return;
    }
    if (um + X - Y < dm + X + Y) {
      que.push({um + X - Y, i});
      u[i] = u[i].update(ui, INF);
    } else {
      que.push({dm + X + Y, i});
      d[i] = d[i].update(di, INF);
    }
  };
  for (usize i = 0; i != N; i += 1) {
    push(i);
  }
  for (usize k = 0; k != K; k += 1) {
    const auto [c, i] = que.top();
    que.pop();
    std::cout << c << "\n";
    push(i);
  }
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |