Problem p02827 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define mp make_pair
#define PI pair<ll, ll>
#define poly vector<ll>
#define mem(a) memset((a), 0, sizeof(a))
#define For(i, l, r) for (int i = (int)(l); i <= (int)(r); i++)
#define Rep(i, r, l) for (int i = (int)(r); i >= (int)(l); i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
#define gc getchar
inline ll read() {
  ll x = 0;
  char ch = gc();
  bool positive = 1;
  for (; !isdigit(ch); ch = gc())
    if (ch == '-')
      positive = 0;
  for (; isdigit(ch); ch = gc())
    x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(ll a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10)
    write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(ll a) {
  write(a);
  puts("");
}
inline void wri(ll a) {
  write(a);
  putchar(' ');
}
inline ull rnd() { return ((ull)rand() << 30 ^ rand()) << 4 | rand() % 4; }
const int N = 50005, M = 100005, K = 256;
int n, m, x[M], y[M], vis[N], to[N];
char ans[M];
void GG() {
  puts("-1");
  exit(0);
}
int main() {

#ifdef Brollan
  freopen("1.in", "r", stdin);
#endif
  n = read(), m = read();
  int T = read();
  double t = clock();
  if (T == 1) {
    static bitset<N> s[N];
    For(i, 1, n) s[i][i] = 1;
    For(i, 1, m) {
      x[i] = read();
      y[i] = read();
      s[x[i]] = s[y[i]] = s[x[i]] | s[y[i]];
    }
    For(i, 1, n) if (s[i].count() == n) {
      vis[i] = 1;
      Rep(j, m, 1) {
        // cout<<x[i]<<" "<<vis[x[i]]<<endl;
        if (vis[x[j]])
          ans[j] = '^';
        else
          ans[j] = 'v';
        vis[x[j]] = vis[y[j]] = vis[x[j]] | vis[y[j]];
      }
      cout << (ans + 1) << endl;
      return 0;
    }
  } else {
    static bitset<K + 2> s[M][K + 2];
    For(i, 1, m) {
      x[i] = read();
      y[i] = read();
    }
    For(i, 1, n) For(j, i + 1, min(n, K)) s[0][i][j] = s[0][j][i] = 1;
    For(o, 0, 1000) {
      int node = 0;
      For(j, 0, 511) to[j] = 0;
      For(j, 0, min(255, n - 1)) {
        int t = rnd() % min(n, 500) + 1;
        while (to[t])
          t = rnd() % min(n, 500) + 1;
        to[t] = ++node;
      }
      For(i, 1, m) {
        memcpy(s[i], s[i - 1], sizeof(s[i]));
        int X = to[x[i]], Y = to[y[i]];
        if (to[X] && to[Y]) {
          s[i][Y] = s[i][X] = s[i][Y] | s[i][X];
          For(j, 1, K) s[i][j][X] = s[i][j][Y] = s[i][j][X] | s[i][j][Y];
          s[i][X][Y] = s[i][Y][X] = s[i][X][X] = s[i][Y][Y] = 0;
        }
      }
      For(X, 1, n)
          For(Y, X + 1, min(n, 500)) if (to[X] && to[Y] && s[m][to[X]][to[Y]]) {
        Rep(i, m, 1) {
          if (s[i - 1][to[X]][to[Y]]) {
            if (X == x[i] || Y == x[i])
              ans[i] = '^';
            else
              ans[i] = 'v';
          } else {
            if (X == x[i] || Y == x[i]) {
              ans[i] = '^';
              if (X == x[i])
                X = y[i];
              else
                Y = y[i];
            } else {
              ans[i] = 'v';
              if (X == y[i])
                X = x[i];
              else
                Y = x[i];
            }
          }
        }
        cout << (ans + 1) << endl;
        exit(0);
      }
      if ((clock() - t) / CLOCKS_PER_SEC > 1.6)
        GG();
    }
  }
  GG();
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define mp make_pair
#define PI pair<ll, ll>
#define poly vector<ll>
#define mem(a) memset((a), 0, sizeof(a))
#define For(i, l, r) for (int i = (int)(l); i <= (int)(r); i++)
#define Rep(i, r, l) for (int i = (int)(r); i >= (int)(l); i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
#define gc getchar
inline ll read() {
  ll x = 0;
  char ch = gc();
  bool positive = 1;
  for (; !isdigit(ch); ch = gc())
    if (ch == '-')
      positive = 0;
  for (; isdigit(ch); ch = gc())
    x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(ll a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10)
    write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(ll a) {
  write(a);
  puts("");
}
inline void wri(ll a) {
  write(a);
  putchar(' ');
}
inline ll rnd() {
  ull ans = 0;
  For(i, 0, 4) ans = ans << 15 ^ rand();
  return ans % ((ull)1 << 63);
}
const int N = 50005, M = 100005, K = 256;
int n, m, x[M], y[M], vis[N], to[N];
char ans[M];
void GG() {
  puts("-1");
  exit(0);
}
int main() {

#ifdef Brollan
  freopen("1.in", "r", stdin);
#endif
  n = read(), m = read();
  int T = read();
  double t = clock();
  if (T == 1) {
    static bitset<N> s[N];
    For(i, 1, n) s[i][i] = 1;
    For(i, 1, m) {
      x[i] = read();
      y[i] = read();
      s[x[i]] = s[y[i]] = s[x[i]] | s[y[i]];
    }
    For(i, 1, n) if (s[i].count() == n) {
      vis[i] = 1;
      Rep(j, m, 1) {
        // cout<<x[i]<<" "<<vis[x[i]]<<endl;
        if (vis[x[j]])
          ans[j] = '^';
        else
          ans[j] = 'v';
        vis[x[j]] = vis[y[j]] = vis[x[j]] | vis[y[j]];
      }
      cout << (ans + 1) << endl;
      return 0;
    }
  } else {
    static bitset<K + 2> s[M][K + 2];
    For(i, 1, m) {
      x[i] = read();
      y[i] = read();
    }
    For(i, 1, n) For(j, i + 1, min(n, K)) s[0][i][j] = s[0][j][i] = 1;
    For(o, 0, 1000) {
      int node = 0;
      For(j, 0, 511) to[j] = 0;
      For(j, 0, min(255, n - 1)) {
        int t = rnd() % min(n, 500) + 1;
        while (to[t])
          t = rnd() % min(n, 500) + 1;
        to[t] = ++node;
      }
      For(i, 1, m) {
        memcpy(s[i], s[i - 1], sizeof(s[i]));
        int X = to[x[i]], Y = to[y[i]];
        if (to[X] && to[Y]) {
          s[i][Y] = s[i][X] = s[i][Y] | s[i][X];
          For(j, 1, K) s[i][j][X] = s[i][j][Y] = s[i][j][X] | s[i][j][Y];
          s[i][X][Y] = s[i][Y][X] = s[i][X][X] = s[i][Y][Y] = 0;
        }
      }
      For(X, 1, n)
          For(Y, X + 1, min(n, 500)) if (to[X] && to[Y] && s[m][to[X]][to[Y]]) {
        Rep(i, m, 1) {
          if (s[i - 1][to[X]][to[Y]]) {
            if (X == x[i] || Y == x[i])
              ans[i] = '^';
            else
              ans[i] = 'v';
          } else {
            if (X == x[i] || Y == x[i]) {
              ans[i] = '^';
              if (X == x[i])
                X = y[i];
              else
                Y = y[i];
            } else {
              ans[i] = 'v';
              if (X == y[i])
                X = x[i];
              else
                Y = x[i];
            }
          }
        }
        cout << (ans + 1) << endl;
        exit(0);
      }
      if ((clock() - t) / CLOCKS_PER_SEC > 1.6)
        GG();
    }
  }
  GG();
}