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

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <ctype.h>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string>
#include <tuple>
#include <vector>

using namespace std;

int main() {
  int i, j, k;
  int n, q;
  // vector<vector<short>>(1, vector<short>(1));
  vector<set<short>> num;
  vector<short> flag(10007, -1);
  int cnt = 0;
  vector<short> ans;

  cin >> n >> q;

  for (i = 0; i < q; i++) {
    short com, x, y;

    cin >> com >> x >> y;

    // x--; y--;

    if (com == 0) {
      if (flag[x] == -1 && flag[y] == -1) {
        set<short> st;

        st.insert(x);
        st.insert(y);
        num.push_back(st);
        flag[x] = num.size() - 1;
        flag[y] = num.size() - 1;

      } else if (flag[x] != -1 && flag[y] != -1) {
        if (flag[x] == flag[y]) {

        } else if (flag[x] < flag[y]) {
          short yy = flag[y];
          // for (auto itr = num[flag[y]].begin(); itr != num[flag[y]].end();
          // ++itr) {
          for (auto itr = num[yy].begin(); itr != num[yy].end(); ++itr) {
            num[flag[x]].insert(*itr);
            flag[*itr] = flag[x];
          }

          //	num.erase(num.begin() + yy);
          num[yy].erase(num[yy].begin(), num[yy].end());

        } else if (flag[x] > flag[y]) {
          short xx = flag[x];
          // for (auto itr = num[flag[x]].begin(); itr != num[flag[x]].end();
          // ++itr) {
          for (auto itr = num[xx].begin(); itr != num[xx].end(); ++itr) {
            num[flag[y]].insert(*itr);
            flag[*itr] = flag[y];
          }

          //	num.erase(num.begin() + xx);
          num[xx].erase(num[xx].begin(), num[xx].end());
        }

      } else if (flag[x] != -1) {
        num[flag[x]].insert(y);
        flag[y] = flag[x];
      } else if (flag[y] != -1) {
        num[flag[y]].insert(x);
        flag[x] = flag[y];
      }
    } else if (com == 1) {
      if (flag[x] == flag[y] && flag[x] != -1) {
        // cout << 1 << endl;
        ans.push_back(1);
      } else {
        // cout << 0 << endl;
        ans.push_back(0);
      }
    }
  }

  for (i = 0; i < ans.size(); i++) {
    cout << ans[i] << endl;
  }

  getchar();
  getchar();
  return 0;
}


Error: 0

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <ctype.h>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string>
#include <tuple>
#include <vector>

using namespace std;

int main() {
  short i, j, k;
  short n, q;
  // vector<vector<short>>(1, vector<short>(1));
  vector<set<short>> num;
  vector<short> flag(10007, -1);
  int cnt = 0;
  vector<short> ans;

  cin >> n >> q;

  for (i = 0; i < q; i++) {
    short com, x, y;

    cin >> com >> x >> y;

    // x--; y--;

    if (com == 0) {
      if (flag[x] == -1 && flag[y] == -1) {
        set<short> st;

        st.insert(x);
        st.insert(y);
        num.push_back(st);
        flag[x] = num.size() - 1;
        flag[y] = num.size() - 1;

      } else if (flag[x] != -1 && flag[y] != -1) {
        if (flag[x] == flag[y]) {

        } else if (flag[x] < flag[y]) {
          short yy = flag[y];
          // for (auto itr = num[flag[y]].begin(); itr != num[flag[y]].end();
          // ++itr) {
          for (auto itr = num[yy].begin(); itr != num[yy].end(); ++itr) {
            num[flag[x]].insert(*itr);
            flag[*itr] = flag[x];
          }
          // num.erase(num.begin() + flag[yy]);
          num.erase(num.begin() + yy);
          //	flag[yy] = flag[x];

        } else if (flag[x] > flag[y]) {
          short xx = flag[x];
          // for (auto itr = num[flag[x]].begin(); itr != num[flag[x]].end();
          // ++itr) {
          for (auto itr = num[xx].begin(); itr != num[xx].end(); ++itr) {
            num[flag[y]].insert(*itr);
            flag[*itr] = flag[y];
          }
          // num.erase(num.begin() + flag[xx]);
          num.erase(num.begin() + xx);
          //	flag[xx] = flag[y];
        }

      } else if (flag[x] != -1) {
        num[flag[x]].insert(y);
        flag[y] = flag[x];
      } else if (flag[y] != -1) {
        num[flag[y]].insert(x);
        flag[x] = flag[y];
      }
    } else if (com == 1) {
      if (flag[x] == flag[y] && flag[x] != -1) {
        // cout << 1 << endl;
        ans.push_back(1);
      } else {
        // cout << 0 << endl;
        ans.push_back(0);
      }
    }
  }

  for (i = 0; i < ans.size(); i++) {
    cout << ans[i] << endl;
  }

  getchar();
  getchar();
  return 0;
}