Problem p00116 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

#define YNUM(X) (X < 0 ? X + 3 : X)

typedef std::pair<int, int> WH;
// typedef std::vector<WH> whvec;

int h, w;
bool map[502][502];
std::string in;
// std::vector<std::vector<whvec> > data(3, std::vector<whvec>(502));
WH data[3][502][10000];
int data_max = 0;
int height_sum[502][502], width_sum[502][502];
int data_pt[3][502];
WH wh;

int main() {
  while (std::cin >> h >> w, w + h != 0) {
    data_max = 0;

    memset(data_pt, 0, sizeof(data_pt));
    memset(height_sum, 0, sizeof(height_sum));
    memset(width_sum, 0, sizeof(width_sum));

    for (int i = 1; i <= h; ++i) {
      std::cin >> in;
      for (int l = 1; l <= w; ++l) {
        map[i][l] = (in[l - 1] == '.');
        if (map[i][l]) {
          width_sum[i][l] = width_sum[i][l - 1] + 1;
          height_sum[i][l] = height_sum[i - 1][l] + 1;
        }
      }
    }

    for (int i = 1, n = 1; n <= h; n++, i = n % 3) {
      for (int l = 1; l <= w; l++) {
        data_pt[i][l] = 0;

        if (map[n][l]) {
          if (map[n - 1][l] && map[n][l - 1]) {
            int x_cnt = width_sum[n][l], y_cnt = height_sum[n][l];

            for (int m = 0; m < data_pt[YNUM(i - 1)][l]; ++m) {
              wh = WH(std::min(data[YNUM(i - 1)][l][m].first, x_cnt),
                      data[YNUM(i - 1)][l][m].second + 1);
              if (std::find(data[i][l], data[i][l] + data_pt[i][l], wh) ==
                  data[i][l] + data_pt[i][l]) {
                data[i][l][data_pt[i][l]] = wh, data_pt[i][l]++;
                data_max = std::max(data_max, wh.first * wh.second);
              }
            }
            for (int m = 0; m < data_pt[i][l - 1]; ++m) {
              wh = WH(data[i][l - 1][m].first + 1,
                      std::min(data[i][l - 1][m].second, y_cnt));
              if (std::find(data[i][l], data[i][l] + data_pt[i][l], wh) ==
                  data[i][l] + data_pt[i][l]) {
                data[i][l][data_pt[i][l]] = wh, data_pt[i][l]++;
                data_max = std::max(data_max, wh.first * wh.second);
              }
            }

          } else if (map[n - 1][l]) {
            for (int m = 0; m < data_pt[YNUM(i - 1)][l]; ++m) {
              data[i][l][data_pt[i][l]] =
                  (wh = WH(1, data[YNUM(i - 1)][l][m].second + 1)),
              data_pt[i][l]++;
              data_max = std::max(data_max, wh.first * wh.second);
            }

          } else if (map[n][l - 1]) {
            for (int m = 0; m < data_pt[i][l - 1]; ++m) {
              data[i][l][data_pt[i][l]] =
                  (wh = WH(data[i][l - 1][m].first + 1, 1)),
              data_pt[i][l]++;
              data_max = std::max(data_max, wh.first * wh.second);
            }

          } else
            data[i][l][data_pt[i][l]] = (wh = WH(1, 1)), data_pt[i][l]++,
            data_max = std::max(data_max, wh.first * wh.second);
        }
      }
    }

    std::cout << data_max << std::endl;
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

#define YNUM(X) (X < 0 ? X + 3 : X)

typedef std::pair<int, int> WH;
// typedef std::vector<WH> whvec;

int h, w;
bool map[502][502];
std::string in;
// std::vector<std::vector<whvec> > data(3, std::vector<whvec>(502));
WH data[3][502][500];
int data_max = 0;
int height_sum[502][502], width_sum[502][502];
int data_pt[3][502];
WH wh;

int main() {
  while (std::cin >> h >> w, w + h != 0) {
    data_max = 0;

    memset(data_pt, 0, sizeof(data_pt));
    memset(height_sum, 0, sizeof(height_sum));
    memset(width_sum, 0, sizeof(width_sum));

    for (int i = 1; i <= h; ++i) {
      std::cin >> in;
      for (int l = 1; l <= w; ++l) {
        map[i][l] = (in[l - 1] == '.');
        if (map[i][l]) {
          width_sum[i][l] = width_sum[i][l - 1] + 1;
          height_sum[i][l] = height_sum[i - 1][l] + 1;
        }
      }
    }

    for (int i = 1, n = 1; n <= h; n++, i = n % 3) {
      for (int l = 1; l <= w; l++) {
        data_pt[i][l] = 0;

        if (map[n][l]) {
          if (map[n - 1][l] && map[n][l - 1]) {
            int x_cnt = width_sum[n][l], y_cnt = height_sum[n][l];

            for (int m = 0; m < data_pt[YNUM(i - 1)][l]; ++m) {
              wh = WH(std::min(data[YNUM(i - 1)][l][m].first, x_cnt),
                      data[YNUM(i - 1)][l][m].second + 1);
              if (std::find(data[i][l], data[i][l] + data_pt[i][l], wh) ==
                  data[i][l] + data_pt[i][l]) {
                data[i][l][data_pt[i][l]] = wh, data_pt[i][l]++;
                data_max = std::max(data_max, wh.first * wh.second);
              }
            }
            for (int m = 0; m < data_pt[i][l - 1]; ++m) {
              wh = WH(data[i][l - 1][m].first + 1,
                      std::min(data[i][l - 1][m].second, y_cnt));
              if (std::find(data[i][l], data[i][l] + data_pt[i][l], wh) ==
                  data[i][l] + data_pt[i][l]) {
                data[i][l][data_pt[i][l]] = wh, data_pt[i][l]++;
                data_max = std::max(data_max, wh.first * wh.second);
              }
            }

          } else if (map[n - 1][l]) {
            for (int m = 0; m < data_pt[YNUM(i - 1)][l]; ++m) {
              data[i][l][data_pt[i][l]] =
                  (wh = WH(1, data[YNUM(i - 1)][l][m].second + 1)),
              data_pt[i][l]++;
              data_max = std::max(data_max, wh.first * wh.second);
            }

          } else if (map[n][l - 1]) {
            for (int m = 0; m < data_pt[i][l - 1]; ++m) {
              data[i][l][data_pt[i][l]] =
                  (wh = WH(data[i][l - 1][m].first + 1, 1)),
              data_pt[i][l]++;
              data_max = std::max(data_max, wh.first * wh.second);
            }

          } else
            data[i][l][data_pt[i][l]] = (wh = WH(1, 1)), data_pt[i][l]++,
            data_max = std::max(data_max, wh.first * wh.second);
        }
      }
    }

    std::cout << data_max << std::endl;
  }
  return 0;
}