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

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

using namespace std;

int n, m;

const int Max = 5020;

int data[Max * Max * 5 / 3];

int *getdata(int x, int y) {
  // return &data[y * Max + x];
  int a;
  y += 2;
  a = (y * (y + 1)) / 2;
  a += x;
  return &data[a];
}

void debug() {
#if 0
	//int n = 50;
	for(int j=1;j<=n + 1;j++){
		for(int i=1;i<=j + 2;i++){
			printf("%+d ",*(getdata(i,j)));
		}
		puts("");
	}
	puts("");
#endif
}

int main() {
  scanf("%d %d", &n, &m);
  int a, b, x;
  for (int i = 0; i < m; i++) {
    scanf("%d %d %d", &b, &a, &x);
    // printf("%d %d %d\\n",a,b,x);
    *(getdata(a, b)) += 1;
    *(getdata(a + 1, b)) -= 1;
    *(getdata(a, b + x + 1)) -= 1;
    *(getdata(a + 1, b + x + 1 + 1)) += 1;
    *(getdata(a + x + 2, b + x + 1)) += 1;
    *(getdata(a + x + 2, b + x + 1 + 1)) -= 1;
  }
  debug();
  // ツ可。ツづ可づづゥ
  for (int i = 0; i < Max; i++) {
    int s = 0;
    for (int j = 0; j < i + 2; j++) {
      s += *(getdata(j, i));
      *(getdata(j, i)) = s;
    }
  }
  debug();
  // ツ縦ツづ可づづゥ
  for (int i = 0; i < Max; i++) {
    int s = 0;
    for (int j = i; j < Max; j++) {
      s += *(getdata(i, j));
      *(getdata(i, j)) = s;
    }
  }
  debug();
  // ツ偲篠づ淞づ可偲ヲツづゥ
  for (int i = 0; i < Max; i++) {
    int s = 0;
    for (int j = 0; i + j < Max; j++) {
      // printf("%d,%d:%d\\n",i,j,i+j);
      if (j < 0 || j + i < 0) {
        continue;
      }
      if (j >= Max || j + i >= Max) {
        break;
      }
      s += *(getdata(j, i + j));
      *(getdata(j, i + j)) = s;
    }
  }
  debug();
  int ans = 0;
  for (int i = 0; i < Max; i++) {
    for (int j = 0; j <= i; j++) {
      if (*(getdata(j, i)) > 0) {
        ans++;
      }
    }
  }
  printf("%d\\n", ans);
}

Error: MLE

Fixed submission:

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

using namespace std;

int n, m;

const int Max = 5020;

int data[Max * Max];

int *getdata(int x, int y) {
  return &data[y * Max + x];
  int a;
  a = (y * (y + 1)) / 2;
  a += x;
  return &data[a];
}

void debug() {
#if 0
	int n = 50;
	for(int j=1;j<=n + 1;j++){
		for(int i=1;i<=n + 1;i++){
			printf("%+d ",*(getdata(i,j)));
		}
		puts("");
	}
	puts("");
#endif
}

int main() {
  scanf("%d %d", &n, &m);
  int a, b, x;
  for (int i = 0; i < m; i++) {
    scanf("%d %d %d", &b, &a, &x);
    // printf("%d %d %d\\n",a,b,x);
    *(getdata(a, b)) += 1;
    *(getdata(a + 1, b)) -= 1;
    *(getdata(a, b + x + 1)) -= 1;
    *(getdata(a + 1, b + x + 1 + 1)) += 1;
    *(getdata(a + x + 2, b + x + 1)) += 1;
    *(getdata(a + x + 2, b + x + 1 + 1)) -= 1;
  }
  debug();
  // ツ可。ツづ可づづゥ
  for (int i = 0; i < Max; i++) {
    int s = 0;
    for (int j = 0; j < Max; j++) {
      s += *(getdata(j, i));
      *(getdata(j, i)) = s;
    }
  }
  debug();
  // ツ縦ツづ可づづゥ
  for (int i = 0; i < Max; i++) {
    int s = 0;
    for (int j = 0; j < Max; j++) {
      s += *(getdata(i, j));
      *(getdata(i, j)) = s;
    }
  }
  debug();
  // ツ偲篠づ淞づ可偲ヲツづゥ
  for (int i = -Max; i < Max; i++) {
    int s = 0;
    for (int j = 0; i + j < Max; j++) {
      // printf("%d,%d:%d\\n",i,j,i+j);
      if (j < 0 || j + i < 0) {
        continue;
      }
      if (j >= Max || j + i >= Max) {
        break;
      }
      s += *(getdata(j, i + j));
      *(getdata(j, i + j)) = s;
    }
  }
  debug();
  int ans = 0;
  for (int i = 0; i < Max; i++) {
    for (int j = 0; j < Max; j++) {
      if (*(getdata(i, j)) > 0) {
        ans++;
      }
      if (*(getdata(i, j)) < 0) {
        // printf("%d:%d\\n",i,j);
      }
    }
  }
  printf("%d\\n", ans);
}