Problem p02827 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
// const ll mod = 1000000007;
int N, M, T;
int x[100000], y[100000];
string ans;
bool Reach[100000];

void solve1() {
  vector<bitset<50000>> bits;
  bits.resize(N);
  for (int i = 0; i < N; i++) {
    bits[i][i] = true;
  }
  for (int i = 0; i < M; i++) {
    bits[x[i]] |= bits[y[i]];
    bits[y[i]] |= bits[x[i]];
  }
  int ansidx = -1;
  for (int i = 0; i < N; i++) {
    if (bits[i].count() == N)
      ansidx = i;
  }
  if (ansidx == -1) {
    cout << -1 << endl;
    return;
  }
  Reach[ansidx] = true;
  for (int e = M - 1; e >= 0; e--) {
    if (Reach[x[e]])
      ans[e] = '^';
    else
      ans[e] = 'v';
    Reach[x[e]] |= Reach[y[e]];
    Reach[y[e]] |= Reach[x[e]];
  }
  cout << ans << endl;
}

vector<int> Connect[50000];
int Index[50000];

void solve2() {
  if (N == 2) {
    cout << -1 << endl;
    return;
  }
  for (int i = 0; i < M; i++) {
    Connect[x[i]].push_back(y[i]);
    Connect[y[i]].push_back(x[i]);
  }
  for (int i = 0; i < N; i++) {
    Reach[i] = true;
  }
  int num = N;
  for (int e = 0; e < M; e++) {
    assert(Connect[x[e]][Index[x[e]]] == y[e]);
    assert(Connect[y[e]][Index[y[e]]] == x[e]);
    if (num > 3) {
      ans[e] = '^';
      num -= Reach[x[e]];
      num -= Reach[y[e]];
      Reach[x[e]] |= Reach[y[e]];
      Reach[y[e]] = false;
      num += Reach[x[e]];
      num += Reach[y[e]];
    } else {
      num -= Reach[x[e]];
      num -= Reach[y[e]];
      if (Index[x[e]] + 1 < Connect[x[e]].size() and
          Reach[Connect[x[e]][Index[x[e]] + 1]]) {
        int to = Connect[x[e]][Index[x[e] + 1]];
        // cerr << x[e] << " " << y[e] << " " << to << endl;
        /*
        if(Connect[to].size() <= Index[to]) {
            for(int i = 0; i <= 1e9; i++) cout << "A" << endl;
        }
        */
        int newidx = Index[to];
        if (to == y[e])
          newidx++;
        if (Connect[to][newidx] == x[e]) {
          ans[e] = 'v';
          Reach[y[e]] |= Reach[x[e]];
          Reach[x[e]] = false;
        } else {
          ans[e] = '^';
          Reach[x[e]] |= Reach[y[e]];
          Reach[y[e]] = false;
        }
      } else {
        ans[e] = '^';
        Reach[x[e]] |= Reach[y[e]];
        Reach[y[e]] = false;
      }
      num += Reach[x[e]];
      num += Reach[y[e]];
    }
    Index[x[e]]++;
    Index[y[e]]++;
    /*
    for(int i = 0; i < N; i++) cerr << Index[i] << " ";
    cerr << endl;
    */
  }
  cout << ans << endl;
}

int main() {
  // cout.precision(10);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N >> M >> T;
  for (int i = 0; i < M; i++) {
    cin >> x[i] >> y[i];
    x[i]--;
    y[i]--;
  }
  ans = string(M, 'a');
  if (T == 1)
    solve1();
  else
    solve2();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
// const ll mod = 1000000007;
int N, M, T;
int x[100000], y[100000];
string ans;
bool Reach[100000];

void solve1() {
  vector<bitset<50000>> bits;
  bits.resize(N);
  for (int i = 0; i < N; i++) {
    bits[i][i] = true;
  }
  for (int i = 0; i < M; i++) {
    bits[x[i]] |= bits[y[i]];
    bits[y[i]] |= bits[x[i]];
  }
  int ansidx = -1;
  for (int i = 0; i < N; i++) {
    if (bits[i].count() == N)
      ansidx = i;
  }
  if (ansidx == -1) {
    cout << -1 << endl;
    return;
  }
  Reach[ansidx] = true;
  for (int e = M - 1; e >= 0; e--) {
    if (Reach[x[e]])
      ans[e] = '^';
    else
      ans[e] = 'v';
    Reach[x[e]] |= Reach[y[e]];
    Reach[y[e]] |= Reach[x[e]];
  }
  cout << ans << endl;
}

vector<int> Connect[50000];
int Index[50000];

void solve2() {
  if (N == 2) {
    cout << -1 << endl;
    return;
  }
  for (int i = 0; i < M; i++) {
    Connect[x[i]].push_back(y[i]);
    Connect[y[i]].push_back(x[i]);
  }
  for (int i = 0; i < N; i++) {
    Reach[i] = true;
  }
  int num = N;
  for (int e = 0; e < M; e++) {
    assert(Connect[x[e]][Index[x[e]]] == y[e]);
    assert(Connect[y[e]][Index[y[e]]] == x[e]);
    if (num > 3) {
      ans[e] = '^';
      num -= Reach[x[e]];
      num -= Reach[y[e]];
      Reach[x[e]] |= Reach[y[e]];
      Reach[y[e]] = false;
      num += Reach[x[e]];
      num += Reach[y[e]];
    } else {
      num -= Reach[x[e]];
      num -= Reach[y[e]];
      if (Index[x[e]] + 1 < Connect[x[e]].size() and
          Reach[Connect[x[e]][Index[x[e]] + 1]]) {
        int to = Connect[x[e]][Index[x[e]] + 1];
        // cerr << x[e] << " " << y[e] << " " << to << endl;
        /*
        if(Connect[to].size() <= Index[to]) {
            for(int i = 0; i <= 1e9; i++) cout << "A" << endl;
        }
        */
        int newidx = Index[to];
        if (to == y[e])
          newidx++;
        if (Connect[to][newidx] == x[e]) {
          ans[e] = 'v';
          Reach[y[e]] |= Reach[x[e]];
          Reach[x[e]] = false;
        } else {
          ans[e] = '^';
          Reach[x[e]] |= Reach[y[e]];
          Reach[y[e]] = false;
        }
      } else {
        ans[e] = '^';
        Reach[x[e]] |= Reach[y[e]];
        Reach[y[e]] = false;
      }
      num += Reach[x[e]];
      num += Reach[y[e]];
    }
    Index[x[e]]++;
    Index[y[e]]++;
    /*
    for(int i = 0; i < N; i++) cerr << Index[i] << " ";
    cerr << endl;
    */
  }
  cout << ans << endl;
}

int main() {
  // cout.precision(10);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N >> M >> T;
  for (int i = 0; i < M; i++) {
    cin >> x[i] >> y[i];
    x[i]--;
    y[i]--;
  }
  ans = string(M, 'a');
  if (T == 1)
    solve1();
  else
    solve2();
  return 0;
}