Problem p00701 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <iostream>
#include <vector>

#define MAX 101
#define INV (-1)

using namespace std;

int piles[MAX][MAX];
int pile_size[MAX];
int places[MAX];

void ResetPiles(int m) {
  for (int i = 0; i < MAX; ++i) {
    places[i] = INV;
    pile_size[i] = 0;
    for (int j = 0; j < MAX; ++j)
      piles[i][j] = INV;
  }
  for (int i = 1; i <= m; ++i) {
    places[i] = i;
    pile_size[i] = 1;
    piles[i][0] = i;
  }
}
void Print() {
  for (int i = 1; i < MAX; ++i) {
    if (pile_size[i] > 0) {
      cout << i << ": ";
      for (int j = 0; j < pile_size[i]; ++j) {
        if (piles[i][j] != INV)
          cout << piles[i][j] << ' ';
      }
      cout << endl;
    }
  }
  cout << endl;
}
void PutOn(int I, int J) {
  if (I == J)
    return;

  if (J == 0) {
    int place = places[I];

    if (pile_size[place] == 1)
      return;

    for (int i = 0; i < pile_size[place]; ++i) {
      if (piles[place][i] == I) {
        int decrease = 0;
        if (i == 0)
          break;
        for (int j = i; j < pile_size[place]; ++j) {
          piles[piles[place][j]][0] = piles[place][j];
          pile_size[piles[place][j]] = 1;
          places[piles[place][j]] = piles[place][j];
          piles[place][j] = INV;
          ++decrease;
        }
        pile_size[place] -= decrease;
        break;
      }
    }
    // Print();
  } else {
    int placei = places[I];
    int placej = places[J];
    int heighti, heightj;

    for (int i = 0; i < pile_size[placei]; ++i) {
      if (piles[placei][i] == I) {
        heighti = i;
      }
    }
    for (int i = 0; i < pile_size[placej]; ++i) {
      if (piles[placej][i] == J) {
        heightj = i;
      }
    }

    if (placei == placej) {
      if (heighti < heightj) {
        int decrease = 0;
        for (int j = heighti + 1; j < pile_size[placei]; ++j) {
          ++decrease;
          piles[piles[placei][j]][pile_size[piles[placei][j]]] =
              piles[placei][j];
          pile_size[piles[placei][j]] = 1;
          places[piles[placei][j]] = piles[placei][j];
          piles[placei][j] = INV;
        }
        pile_size[placei] -= decrease;
        placej = places[J];

        piles[placej][pile_size[placej]] = I;
        ++pile_size[placej];
        --pile_size[placei];
        places[I] = placej;
        piles[placei][heighti] = INV;
      }
    } else {
      int decrease = 0;
      for (int i = heighti + 1; i < pile_size[placei]; ++i) {
        ++decrease;
        piles[piles[placei][i]][0] = piles[placei][i];
        pile_size[piles[placei][i]] = 1;
        places[piles[placei][i]] = piles[placei][i];
        piles[placei][i] = INV;
      }
      ++decrease;
      pile_size[placei] -= decrease;
      piles[placej][pile_size[placej]] = I;
      places[I] = placej;
      ++pile_size[placej];
      piles[placei][heighti] = INV;
    }
    // Print();
  }
}

int main() {
  while (true) {
    int m;
    vector<int> sizes;

    scanf("%d", &m);
    if (m == 0)
      break;
    ResetPiles(m);
    while (true) {
      int I, J;
      scanf("%d%d", &I, &J);
      if (I == 0 && J == 0)
        break;
      PutOn(I, J);
    }
    for (int i = 1; i <= m; ++i) {
      sizes.push_back(pile_size[i]);
    }
    sort(sizes.begin(), sizes.end());
    for (unsigned int i = 0; i < sizes.size(); ++i) {
      if (sizes[i] > 0)
        printf("%d\\n", sizes[i]);
    }
    printf("end\\n");
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <iostream>
#include <vector>

#define MAX 101
#define INV (-1)

using namespace std;

int piles[MAX][MAX];
int pile_size[MAX];
int places[MAX];

void ResetPiles(int m) {
  for (int i = 0; i < MAX; ++i) {
    places[i] = INV;
    pile_size[i] = 0;
    for (int j = 0; j < MAX; ++j)
      piles[i][j] = INV;
  }
  for (int i = 1; i <= m; ++i) {
    places[i] = i;
    pile_size[i] = 1;
    piles[i][0] = i;
  }
}
void Print() {
  for (int i = 1; i < MAX; ++i) {
    if (pile_size[i] > 0) {
      cout << i << ": ";
      for (int j = 0; j < pile_size[i]; ++j) {
        if (piles[i][j] != INV)
          cout << piles[i][j] << ' ';
      }
      cout << endl;
    }
  }
  cout << endl;
}
void PutOn(int I, int J) {
  if (I == J)
    return;

  if (J == 0) {
    int place = places[I];

    if (pile_size[place] == 1)
      return;

    for (int i = 0; i < pile_size[place]; ++i) {
      if (piles[place][i] == I) {
        int decrease = 0;
        if (i == 0)
          break;
        for (int j = i; j < pile_size[place]; ++j) {
          piles[piles[place][j]][0] = piles[place][j];
          pile_size[piles[place][j]] = 1;
          piles[place][j] = INV;
          ++decrease;
          places[piles[place][j]] = piles[place][j];
        }
        pile_size[place] -= decrease;
        break;
      }
    }
    // Print();
  } else {
    int placei = places[I];
    int placej = places[J];
    int heighti, heightj;

    for (int i = 0; i < pile_size[placei]; ++i) {
      if (piles[placei][i] == I) {
        heighti = i;
      }
    }
    for (int i = 0; i < pile_size[placej]; ++i) {
      if (piles[placej][i] == J) {
        heightj = i;
      }
    }

    if (placei == placej) {
      if (heighti < heightj) {
        int decrease = 0;
        for (int j = heighti + 1; j < pile_size[placei]; ++j) {
          piles[piles[placei][j]][pile_size[piles[placei][j]]] =
              piles[placei][j];
          pile_size[piles[placei][j]] = 1;
          piles[placei][j] = INV;
          ++decrease;
          places[piles[placei][j]] = piles[placei][j];
        }
        pile_size[placei] -= decrease;
        placej = places[J];

        piles[placej][pile_size[placej]] = I;
        ++pile_size[placej];
        piles[placei][heighti] = INV;
        --pile_size[placei];
        places[I] = J;
      }
    } else {
      int decrease = 0;
      for (int i = heighti + 1; i < pile_size[placei]; ++i) {
        ++decrease;
        piles[piles[placei][i]][0] = piles[placei][i];
        pile_size[piles[placei][i]] = 1;
        places[piles[placei][i]] = piles[placei][i];
        piles[placei][i] = INV;
      }
      ++decrease;
      pile_size[placei] -= decrease;
      piles[placej][pile_size[placej]] = I;
      ++pile_size[placej];
      piles[placei][heighti] = INV;
      places[I] = J;
    }
    // Print();
  }
}

int main() {
  while (true) {
    int m;
    vector<int> sizes;

    scanf("%d", &m);
    if (m == 0)
      break;
    ResetPiles(m);
    while (true) {
      int I, J;
      scanf("%d%d", &I, &J);
      if (I == 0 && J == 0)
        break;
      PutOn(I, J);
    }
    for (int i = 1; i <= m; ++i) {
      sizes.push_back(pile_size[i]);
    }
    sort(sizes.begin(), sizes.end());
    for (unsigned int i = 0; i < sizes.size(); ++i) {
      if (sizes[i] > 0)
        printf("%d\\n", sizes[i]);
    }
    printf("end\\n");
  }
  return 0;
}