Problem p02827 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void ch(int &x, int &y) {
  if (y < x) {
    int tmp = y;
    y = x;
    x = tmp;
  }
}

int N, M, T;
vector<int> x, y;

void solve1() {
  using bs = bitset<50001>;
  vector<bs> dp(N + 1); // dp[i][j] は i から j にゴールできるかどうか
  for (int i = 1; i <= N; ++i) {
    dp[i][i] = 1;
  }
  for (int i = M - 1; i >= 0; --i) {
    dp[x[i]] |= dp[y[i]];
    dp[y[i]] = dp[x[i]];
  }

  bs flag1;
  flag1.set();
  for (int i = 1; i < N; ++i) {
    flag1 &= dp[i];
  }

  for (int j = 1; j <= N; ++j) {
    if (flag1[j]) {
      string s(M, '^');
      bs flag;
      flag[j] = 1;
      for (int i = M - 1; i >= 0; --i) {
        if (flag[y[i]] == 1)
          s[i] = 'v';
        flag[x[i]] = flag[x[i]] || flag[y[i]];
        flag[y[i]] = flag[x[i]];
      }
      assert(flag.count() == N);
      cout << s << "\n";
      return;
    }
  }
  cout << -1 << "\n";
}

void solve2() {
  if (N == 2) {
    cout << -1 << "\n";
    return;
  }
  vector<vector<int>> graph(N + 1, vector<int>());
  for (int i = 0; i < M; ++i) {
    graph[x[i]].push_back(i);
    graph[y[i]].push_back(i);
  }

  int x1 = x[0];
  int y1 = y[0] + 1;
  if (y1 == N + 1) {
    if (x1 == 1)
      y1 = 2;
    else
      y1 = 1;
  }
  ch(x1, y1);

  // 次で衝突する場合は進路転換
  for (int i = 0; i < M; ++i) {
    auto iter1 = upper_bound(graph[x1].begin(), graph[x1].end(), i);
    auto iter2 = upper_bound(graph[y1].begin(), graph[y1].end(), i);
    if (iter1 != graph[x1].end() && iter2 != graph[y1].end() &&
        (*iter1 == *iter2)) {
      if (x[i] == x1) {
        cout << "v";
        x1 = y[i];
      } else if (y[i] == y1) {
        cout << "^";
        y1 = x[i];
      } else if (y[i] == x1) {
        cout << "^";
        x1 = x[i];
      } else if (x[i] == y1) {
        cout << "v";
        y1 = y[i];
      }
    } else {
      if (y[i] == y1 || y[i] == x1) {
        cout << "v";
      } else {
        cout << "^";
      }
    }
    ch(x1, y1);
  }
}

int main() {
  cin >> N >> M >> T;
  x.resize(M);
  y.resize(M);
  for (int i = 0; i < M; ++i) {
    cin >> x[i] >> y[i];
  }
  if (T == 1)
    solve1();
  else
    solve2();
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void ch(int &x, int &y) {
  if (y < x) {
    int tmp = y;
    y = x;
    x = tmp;
  }
}

int N, M, T;
vector<int> x, y;

void solve1() {
  using bs = bitset<50001>;
  vector<bs> dp(N + 1); // dp[i][j] は i から j にゴールできるかどうか
  for (int i = 1; i <= N; ++i) {
    dp[i][i] = 1;
  }
  for (int i = M - 1; i >= 0; --i) {
    dp[x[i]] |= dp[y[i]];
    dp[y[i]] = dp[x[i]];
  }

  bs flag1;
  flag1.set();
  for (int i = 1; i <= N; ++i) {
    flag1 &= dp[i];
  }

  for (int j = 1; j <= N; ++j) {
    if (flag1[j]) {
      string s(M, '^');
      bs flag;
      flag[j] = 1;
      for (int i = M - 1; i >= 0; --i) {
        if (flag[y[i]] == 1)
          s[i] = 'v';
        flag[x[i]] = flag[x[i]] || flag[y[i]];
        flag[y[i]] = flag[x[i]];
      }
      assert(flag.count() == N);
      cout << s << "\n";
      return;
    }
  }
  cout << -1 << "\n";
}

void solve2() {
  if (N == 2) {
    cout << -1 << "\n";
    return;
  }
  vector<vector<int>> graph(N + 1, vector<int>());
  for (int i = 0; i < M; ++i) {
    graph[x[i]].push_back(i);
    graph[y[i]].push_back(i);
  }

  int x1 = x[0];
  int y1 = y[0] + 1;
  if (y1 == N + 1) {
    if (x1 == 1)
      y1 = 2;
    else
      y1 = 1;
  }
  ch(x1, y1);

  // 次で衝突する場合は進路転換
  for (int i = 0; i < M; ++i) {
    auto iter1 = upper_bound(graph[x1].begin(), graph[x1].end(), i);
    auto iter2 = upper_bound(graph[y1].begin(), graph[y1].end(), i);
    if (iter1 != graph[x1].end() && iter2 != graph[y1].end() &&
        (*iter1 == *iter2)) {
      if (x[i] == x1) {
        cout << "v";
        x1 = y[i];
      } else if (y[i] == y1) {
        cout << "^";
        y1 = x[i];
      } else if (y[i] == x1) {
        cout << "^";
        x1 = x[i];
      } else if (x[i] == y1) {
        cout << "v";
        y1 = y[i];
      }
    } else {
      if (y[i] == y1 || y[i] == x1) {
        cout << "v";
      } else {
        cout << "^";
      }
    }
    ch(x1, y1);
  }
}

int main() {
  cin >> N >> M >> T;
  x.resize(M);
  y.resize(M);
  for (int i = 0; i < M; ++i) {
    cin >> x[i] >> y[i];
  }
  if (T == 1)
    solve1();
  else
    solve2();
  return 0;
}