Submission #968264

#TimeUsernameProblemLanguageResultExecution timeMemory
968264kilkuwuNew Home (APIO18_new_home)C++17
100 / 100
3113 ms134108 KiB
#include <bits/stdc++.h>

#define nl '\n'

#ifdef LOCAL
#include "template/debug.hpp"
#else
#define dbg(...) ;
#define timer(...) ;
#endif

struct SegmentTree {
  int n;
  std::vector<int> t;

  SegmentTree(int _n) : n(_n), t(2 * n, -1) {}

  void update(int p, int v) {
    for (t[p += n] = v; p > 1; p >>= 1) {
      t[p >> 1] = std::max(t[p], t[p ^ 1]);
    }
  }

  int query(int l, int r) {
    int ans = -1;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) ans = std::max(ans, t[l++]);
      if (r & 1) ans = std::max(ans, t[--r]);
    }
    return ans;
  }
};

struct Store {
  int x, t, a, b;

  bool operator<(const Store& rhs) const {
    return x < rhs.x;
  }  
};

struct Query {
  int l, y;
};

struct Event {
  int time, id;
  
  bool operator<(const Event& rhs) const {
    return std::make_pair(time, id) < std::make_pair(rhs.time, rhs.id);
  }
};

bool operator<(const Store& s, const int& x) {
  return s.x < x;
}

bool operator<(const int& x, const Store& s) {
  return x < s.x;
}

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, k, q;
  std::cin >> n >> k >> q;

  std::vector<Store> stores(n + 1);
  stores[0].x = -1;
  for (int i = 0; i < n; i++) {
    int x, t, a, b;
    std::cin >> x >> t >> a >> b;
    --t;
    stores[i + 1] = {x, t, a, b};
  }
  std::sort(stores.begin() + 1, stores.end());

  std::vector<int> ans(q);
  std::vector<Query> queries(q);
  for (int i = 0; i < q; i++) {
    std::cin >> queries[i].l >> queries[i].y;
  }

  std::vector<Event> events;
  for (int i = 1; i <= n; i++) {
    events.push_back({stores[i].a, i});
    events.push_back({stores[i].b + 1, i});
  }

  for (int i = 0; i < q; i++) {
    events.push_back({queries[i].y, i + n + 1});
  }

  std::sort(events.begin(), events.end());
  std::vector<std::set<int>> pos(k);

  std::vector<std::multiset<int>> at(n + 1);

  for (int i = 0; i < k; i++) {
    at[0].insert(n + 1);
    pos[i].insert(0);
    pos[i].insert(n + 1);
  }

  dbg("goes here");

  SegmentTree tree(n + 1);
  tree.update(0, n + 1);

  auto rem_at = [&](int id, int v) {
    at[id].erase(at[id].find(v));
    tree.update(id, at[id].empty() ? -1 : *at[id].rbegin());
  };

  auto add_at = [&](int id, int v) {
    at[id].insert(v);
    tree.update(id, at[id].empty() ? -1 : *at[id].rbegin());
  };

  for (auto [time, id] : events) {
    dbg(time, id);
    if (id <= n) {
      auto [x, t, a, b] = stores[id];
      if (time == a) {
        dbg("goes insert", time, id);
        dbg(pos[t], t);
        auto it = pos[t].insert(id).first;
        auto pre = std::prev(it);
        auto nxt = std::next(it);

        dbg(*it, *pre, *nxt);

        rem_at(*pre, *nxt);
        add_at(*pre, *it);
        add_at(*it, *nxt);
      } else {
        auto it = pos[t].find(id);
        auto pre = std::prev(it);
        auto nxt = std::next(it);
        rem_at(*it, *nxt);
        rem_at(*pre, *it);
        add_at(*pre, *nxt);
        pos[t].erase(it);
      }
    } else {
      id -= n + 1;

      int res = -1;
      int lb = 0, rb = 1e8;

      while (lb <= rb) {
        int mb = (lb + rb) / 2;
        int ql = std::lower_bound(stores.begin() + 1, stores.end(), queries[id].l - mb) - stores.begin();
        int qr = std::upper_bound(stores.begin() + 1, stores.end(), queries[id].l + mb) - stores.begin();

        if (tree.query(0, ql) < qr) {
          res = mb;
          rb = mb - 1;
        } else {
          lb = mb + 1;
        }
      }

      ans[id] = res;
    }
  }

  for (int i = 0; i < q; i++) {
    std::cout << ans[i] << nl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...