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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, j) FOR(i, 0, j)
#define mp std::make_pair

const int INF = 1 << 24;
const int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1},
          dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};

typedef unsigned long long ull;
typedef std::pair<int, int> P;

std::vector<int> map[5002];

int main() {
  int N, M;
  std::cin >> N >> M;

  REP(i, N + 2) {
    map[i].resize(i + 3);
    std::fill(map[i].begin(), map[i].end(), 0);
  }

  REP(i, M) {
    int a, b, x;
    std::cin >> a >> b >> x;
    a--;
    b--;

    map[a][b] += +1;
    map[a][b + 1] += -1;
    map[a + x + 1][b] += -1;
    map[a + x + 1][b + x + 2] += +1;
    map[a + x + 2][b + 1] += +1;
    map[a + x + 2][b + x + 2] += -1;
  }

  REP(i, N) {
    FOR(j, 1, i + 1) { map[i][j] += map[i][j - 1]; }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  REP(i, N) {
    for (int j = 1; i + j < N; j++) {
      map[i + j][j] += map[i + j - 1][j - 1];
    }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  REP(i, N) {
    FOR(j, i + 1, N) { map[j][i] += map[j - 1][i]; }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  int res = 0;
  REP(i, N) {
    REP(j, i + 1) {
      if (map[i][j] > 0) {
        res++;
      }
    }
  }

  std::cout << res << std::endl;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, j) FOR(i, 0, j)
#define mp std::make_pair

const int INF = 1 << 24;
const int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1},
          dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};

typedef unsigned long long ull;
typedef std::pair<int, int> P;

int map[5002][5002];

int main() {
  int N, M;
  std::cin >> N >> M;

  REP(i, M) {
    int a, b, x;
    std::cin >> a >> b >> x;
    a--;
    b--;

    map[a][b] += +1;
    map[a][b + 1] += -1;
    map[a + x + 1][b] += -1;
    map[a + x + 1][b + x + 2] += +1;
    map[a + x + 2][b + 1] += +1;
    map[a + x + 2][b + x + 2] += -1;
  }

  REP(i, N) {
    FOR(j, 1, i + 1) { map[i][j] += map[i][j - 1]; }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  REP(i, N) {
    for (int j = 1; i + j < N; j++) {
      map[i + j][j] += map[i + j - 1][j - 1];
    }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  REP(i, N) {
    FOR(j, i + 1, N) { map[j][i] += map[j - 1][i]; }
  }

  // puts("-----------------------------");
  // REP(i, N){
  //     REP(j, i+1){
  //         printf("%2d, ", map[i][j]);
  //     }
  //     puts("");
  // }

  int res = 0;
  REP(i, N) {
    REP(j, i + 1) {
      if (map[i][j] > 0) {
        res++;
      }
    }
  }

  std::cout << res << std::endl;
}