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

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class ps {
public:
  int w;
  int d;

  ps() {}
  ps(int b, int c) {
    w = b;
    d = c;
  }

  int area() { return w * d; }
};

int main(void) {
  int n, w, d;
  int p, s;
  int k;
  while (cin >> n >> w >> d, n || w || d) {
    k = 2;
    vector<ps> v;
    v.push_back(ps(w, d));
    for (int i = 0; i < n; i++) {
      cin >> p >> s;
      p--;
      s %= (v[p].w * 2 + v[p].d * 2);
      if (s <= v[p].w) {
        int w1, d1, w2, d2;
        w1 = s;
        d1 = v[p].d;
        w2 = v[p].w - s;
        d2 = v[p].d;
        v.erase(v.begin() + p);
        if (w1 * d1 > w2 * d2) {
          v.push_back(ps(w2, d2));
          v.push_back(ps(w1, d1));
        } else {
          v.push_back(ps(w1, d1));
          v.push_back(ps(w2, d2));
        }
      } else if (s <= v[p].w + v[p].d) {
        int w1, d1, w2, d2;
        w1 = v[p].w;
        d1 = v[p].d - s + v[p].w;
        w2 = v[p].w;
        d2 = v[p].d - d1;
        v.erase(v.begin() + p);
        if (w1 * d1 > w2 * d2) {
          v.push_back(ps(w2, d2));
          v.push_back(ps(w1, d1));
        } else {
          v.push_back(ps(w1, d1));
          v.push_back(ps(w2, d2));
        }
      } else if (s <= v[p].w * 2 + v[p].d) {
        int w1, d1, w2, d2;
        w1 = v[p].w - s + v[p].w + v[p].d;
        d1 = v[p].d;
        w2 = v[p].w - w1;
        d2 = v[p].d;
        v.erase(v.begin() + p);
        if (w1 * d1 > w2 * d2) {
          v.push_back(ps(w2, d2));
          v.push_back(ps(w1, d1));
        } else {
          v.push_back(ps(w1, d1));
          v.push_back(ps(w2, d2));
        }
      } else {
        int w1, d1, w2, d2;
        w1 = v[p].w;
        d1 = v[p].d - s + v[p].w + v[p].d + v[p].w;
        w2 = v[p].w;
        d2 = v[p].d - d1;
        v.erase(v.begin() + p);
        if (w1 * d1 > w2 * d2) {
          v.push_back(ps(w2, d2));
          v.push_back(ps(w1, d1));
        } else {
          v.push_back(ps(w1, d1));
          v.push_back(ps(w2, d2));
        }
      }

      // cout<<"v["<<k-1<<"]="<<v[k-1].w<<","<<v[k-1].d;
      // cout<<" v["<<p<<"]="<<v[p].w<<","<<v[p].d<<endl;
    }
    vector<int> ee;
    for (int i = 0; i <= n; i++)
      ee.push_back(v[i].area());
    sort(ee.begin(), ee.end());
    for (int i = 0; i < ee.size(); i++) {
      if (i != ee.size() - 1)
        cout << ee[i] << " ";
      else
        cout << ee[i];
    }
    cout << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class ps {
public:
  int w;
  int d;

  ps() {}
  ps(int b, int c) {
    w = b;
    d = c;
  }

  int area() { return w * d; }
};

int main(void) {
  int n, w, d;
  ps v[200];
  int p, s;
  int k;
  while (cin >> n >> w >> d, n || w || d) {
    k = 2;
    v[1] = ps(w, d);
    for (int i = 0; i < n; i++) {
      cin >> p >> s;
      s %= (v[p].w * 2 + v[p].d * 2);
      if (s <= v[p].w) {
        int w1, d1, w2, d2;
        w1 = s;
        d1 = v[p].d;
        w2 = v[p].w - s;
        d2 = v[p].d;
        if (w1 * d1 > w2 * d2) {
          v[k++] = ps(w1, d1);
          v[p] = ps(w2, d2);
        } else {
          v[k++] = ps(w2, d2);
          v[p] = ps(w1, d1);
        }
      } else if (s <= v[p].w + v[p].d) {
        int w1, d1, w2, d2;
        w1 = v[p].w;
        d1 = v[p].d - s + v[p].w;
        w2 = v[p].w;
        d2 = v[p].d - d1;
        if (w1 * d1 > w2 * d2) {
          v[k++] = ps(w1, d1);
          v[p] = ps(w2, d2);
        } else {
          v[k++] = ps(w2, d2);
          v[p] = ps(w1, d1);
        }
      } else if (s <= v[p].w * 2 + v[p].d) {
        int w1, d1, w2, d2;
        w1 = v[p].w - s + v[p].w + v[p].d;
        d1 = v[p].d;
        w2 = v[p].w - w1;
        d2 = v[p].d;
        if (w1 * d1 > w2 * d2) {
          v[k++] = ps(w1, d1);
          v[p] = ps(w2, d2);
        } else {
          v[k++] = ps(w2, d2);
          v[p] = ps(w1, d1);
        }
      } else {
        int w1, d1, w2, d2;
        w1 = v[p].w;
        d1 = v[p].d - s + v[p].w + v[p].d + v[p].w;
        w2 = v[p].w;
        d2 = v[p].d - d1;
        if (w1 * d1 > w2 * d2) {
          v[k++] = ps(w1, d1);
          v[p] = ps(w2, d2);
        } else {
          v[k++] = ps(w2, d2);
          v[p] = ps(w1, d1);
        }
      }
    }
    vector<int> ee;
    for (int i = 1; i <= n + 1; i++)
      ee.push_back(v[i].area());
    sort(ee.begin(), ee.end());
    for (int i = 0; i < ee.size(); i++) {
      if (i != ee.size() - 1)
        cout << ee[i] << " ";
      else
        cout << ee[i];
    }
    cout << endl;
  }
  return 0;
}