제출 #1361822

#제출 시각아이디문제언어결과실행 시간메모리
1361822avighnaGarden 3 (JOI26_garden)C++20
3 / 100
206 ms11512 KiB
#include <bits/stdc++.h>

using namespace std;

const int64_t inf = 1e15;

class lazy_segtree {
  struct node {
    int64_t max_val, lazy;
    node *l, *r;
    node(int64_t k) : max_val(-k), lazy(0), l(nullptr), r(nullptr) {}
    ~node() {
      delete l;
      delete r;
    }
  };
  node *t;

  int64_t k;
  int n;

  void push(node *t) {
    t->max_val += t->lazy;
    t->l = t->l ? t->l : new node(k);
    t->r = t->r ? t->r : new node(k);
    t->l->lazy += t->lazy;
    t->r->lazy += t->lazy;
    t->lazy = 0;
  }

  void pull(node *t) {
    t->max_val = max(t->l->max_val, t->r->max_val);
  }

  void add(node *t, int tl, int tr, int l, int r, int64_t del) {
    push(t);
    if (tr < l || r < tl || l > r) return;
    if (l <= tl && tr <= r) {
      t->lazy += del;
      push(t);
      return;
    }
    int tm = (tl + tr) / 2;
    add(t->l, tl, tm, l, r, del);
    add(t->r, tm + 1, tr, l, r, del);
    pull(t);
  }

  int64_t query(node *t, int tl, int tr, int l, int r) {
    push(t);
    if (tr < l || r < tl || l > r) return -inf;
    if (l <= tl && tr <= r) return t->max_val;
    int tm = (tl + tr) / 2;
    return max(query(t->l, tl, tm, l, r), query(t->r, tm + 1, tr, l, r));
  }

public:
  lazy_segtree(int n, int64_t k) : n(n), k(k), t(new node(k)) {}
  ~lazy_segtree() { delete t; }

  void add(int l, int r, int64_t del) { add(t, 0, n - 1, l, r, del); }
  int64_t query(int l, int r) { return query(t, 0, n - 1, l, r); }
};

class lazy_2dtree {
  int64_t k;
  int n, m;

  vector<lazy_segtree *> trees;

public:
  lazy_2dtree(int n, int m, int64_t k) : n(n), m(m), k(k), trees(n) {
    for (int i = 0; i < n; ++i) {
      trees[i] = new lazy_segtree(m, k);
    }
  }
  ~lazy_2dtree() {
    for (auto &i : trees) { delete i; }
  }

  void add(int lx, int rx, int ly, int ry, int64_t del) {
    for (int i = lx; i <= rx; ++i) {
      trees[i]->add(ly, ry, del);
    }
  }

  int64_t query(int lx, int rx, int ly, int ry) {
    int64_t ans = -inf;
    for (int i = lx; i <= rx; ++i) {
      ans = max(ans, trees[i]->query(ly, ry));
    }
    return ans;
  }
};

struct query {
  int lx, rx, ly, ry, c;
};

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, m, q;
  int64_t k;
  cin >> n >> m >> q >> k;
  swap(n, m);

  vector<query> queries(q);
  vector<int> buff_x, buff_y;
  for (auto &[lx, rx, ly, ry, c] : queries) {
    cin >> lx >> rx >> ly >> ry >> c;
    swap(lx, ly), swap(rx, ry);
    --lx, --ly, --rx, --ry;
    buff_x.push_back(lx), buff_x.push_back(rx);
    buff_y.push_back(ly), buff_y.push_back(ry);
  }

  sort(buff_x.begin(), buff_x.end());
  sort(buff_y.begin(), buff_y.end());
  buff_x.erase(unique(buff_x.begin(), buff_x.end()), buff_x.end());
  buff_y.erase(unique(buff_y.begin(), buff_y.end()), buff_y.end());
  auto comp_x = [&](int i) { return lower_bound(buff_x.begin(), buff_x.end(), i) - buff_x.begin(); };
  auto comp_y = [&](int i) { return lower_bound(buff_y.begin(), buff_y.end(), i) - buff_y.begin(); };

  n = buff_x.size(), m = buff_y.size();
  int min_x = n, max_x = -1, min_y = m, max_y = -1;
  for (auto &[lx, rx, ly, ry, c] : queries) {
    lx = comp_x(lx), ly = comp_y(ly), rx = comp_x(rx), ry = comp_y(ry);
    min_x = min(min_x, lx);
    min_y = min(min_y, ly);
    max_x = max(max_x, rx);
    max_y = max(max_y, ry);
    if (min_x > max_x || min_y > max_y) {
      cout << "0\n";
    } else {
      cout << int64_t(buff_x[max_x] - buff_x[min_x] + 1) * (buff_y[max_y] - buff_y[min_y] + 1) << '\n';
    }
  }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…