Problem p00297 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm>
#include <cstdio>
#include <vector>

#define INF 1e6

using namespace std;

typedef long long ll;
int n, d;
struct data {
  ll x, y, c;
};

bool comp(const data &d1, const data &d2) { return d1.c < d2.c; };

data s[200001];

struct segtree {
  int val, b, s, v2;
};
segtree seg[2][1 << 19];
vector<ll> x_d, y_d;

void init() {
  for (int i = 0; i < (1 << 19); i++)
    seg[0][i].s = seg[1][i].s = INF;
  for (int i = 1 << 18; i < 1 << 19; i++)
    seg[0][i].v2 = seg[1][i].v2 = i - (1 << 18);
  sort(x_d.begin(), x_d.end());
  x_d.erase(unique(x_d.begin(), x_d.end()), x_d.end());
  sort(y_d.begin(), y_d.end());
  y_d.erase(unique(y_d.begin(), y_d.end()), y_d.end());
  for (int i = 0; i < n; i++) {
    int num = lower_bound(x_d.begin(), x_d.end(), s[i].x) - x_d.begin();
    s[i].x = num;
    num = lower_bound(y_d.begin(), y_d.end(), s[i].y) - y_d.begin();
    s[i].y = num;
  }
}

void update(int upd, int x, int a) {
  x += (1 << 18);
  seg[upd][x].val += a;
  if (seg[upd][x].val >= 1)
    seg[upd][x].s = seg[upd][x].b = seg[upd][x].v2;
  else {
    seg[upd][x].s = INF;
    seg[upd][x].b = 0;
  }
  while (x > 0) {
    x = (x - 1) / 2;
    seg[upd][x].s = min(seg[upd][x * 2 + 1].s, seg[upd][x * 2 + 2].s);
    seg[upd][x].b = max(seg[upd][x * 2 + 1].b, seg[upd][x * 2 + 2].b);
  }
}

int main(void) {
  scanf("%d%d", &n, &d);
  for (int i = 0; i < n; i++) {
    scanf("%lld%lld%lld", &s[i].x, &s[i].y, &s[i].c);
    x_d.push_back(s[i].x);
    y_d.push_back(s[i].y);
  }
  init();
  sort(s, s + n, comp);
  ll res = 0;
  int mc = 0;
  for (int i = 0; i < n; i++) {
    update(0, s[i].x, 1);
    update(1, s[i].y, 1);
    while (s[i].c - s[mc].c > d) {
      update(0, s[mc].x, -1);
      update(1, s[mc].y, -1);
      mc++;
    }
    res = max(res, (x_d[seg[0][0].b] - x_d[seg[0][0].s]) *
                       (y_d[seg[1][0].b] - y_d[seg[1][0].s]));
  }
  printf("%lld\\n", res);
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#define INF 1e9
using namespace std;
typedef long long ll;
int n, d;
struct data {
  ll x, y, c;
};

bool comp(const data &d1, const data &d2) { return d1.c < d2.c; };

data s[200001];

struct segtree {
  ll val, b, s, v2;
};
segtree seg[2][1 << 23];

void init() {
  for (int i = 0; i < (1 << 23); i++)
    seg[0][i].s = seg[1][i].s = INF;
  for (int i = 1 << 22; i < 1 << 23; i++)
    seg[0][i].v2 = seg[1][i].v2 = i - (1 << 22);
}

void update(int upd, int x, int a) {
  x += (1 << 22);
  seg[upd][x].val += a;
  if (seg[upd][x].val >= 1)
    seg[upd][x].s = seg[upd][x].b = seg[upd][x].v2;
  else {
    seg[upd][x].s = INF;
    seg[upd][x].b = 0;
  }
  while (x > 0) {
    x = (x - 1) / 2;
    seg[upd][x].s = min(seg[upd][x * 2 + 1].s, seg[upd][x * 2 + 2].s);
    seg[upd][x].b = max(seg[upd][x * 2 + 1].b, seg[upd][x * 2 + 2].b);
  }
}

int main(void) {
  scanf("%d%d", &n, &d);
  init();
  for (int i = 0; i < n; i++)
    scanf("%lld%lld%lld", &s[i].x, &s[i].y, &s[i].c);
  sort(s, s + n, comp);
  ll res = 0;
  int mc = 0;
  for (int i = 0; i < n; i++) {
    update(0, s[i].x, 1);
    update(1, s[i].y, 1);
    while (s[i].c - s[mc].c > d) {
      update(0, s[mc].x, -1);
      update(1, s[mc].y, -1);
      mc++;
    }
    res = max(res, (seg[0][0].b - seg[0][0].s) * (seg[1][0].b - seg[1][0].s));
  }
  printf("%lld\\n", res);
  return 0;
}