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

#include <bits/stdc++.h>
using namespace std;

using Pair = pair<int, int>;

int N;
int M;
int g_idx;
char buf[114514];
int par[4145];
int myrank[4145];
bool used[4145];
bool isr[4145][4145];
bool isr2[4145][4145];

vector<int> vs[4145];
vector<int> es[4145];
vector<int> res[4145];
vector<int> bs[4145];
map<string, int> mp;

int root(int v) {
  if (par[v] == v)
    return v;
  return par[v] = root(par[v]);
}

void unite(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b)
    return;
  if (myrank[a] < myrank[b])
    par[a] = b;
  else if (myrank[b] < myrank[a])
    par[b] = a;
  else {
    par[a] = b;
    myrank[a]++;
  }
}

Pair GetIdx(string &s) {
  auto itr = s.find('-');
  string a;
  a.assign(s, 0, itr);
  string b;
  b.assign(s, itr + 1, s.size() - itr - 1);
  if (!mp.count(a))
    mp[a] = g_idx++;
  if (!mp.count(b))
    mp[b] = g_idx++;
  return Pair(mp[a], mp[b]);
}

void dfs1(int v, int k) {
  isr[k][v] = true;
  for (int u : es[v]) {
    if (isr[k][u])
      continue;
    dfs1(u, k);
  }
}

void dfs2(int v, int k) {
  for (int dv : vs[root(v)]) {
    if (isr2[k][dv])
      return;
  }

  for (int dv : vs[root(v)]) {
    isr2[k][dv] = true;
    for (int u : es[dv]) {
      if (isr2[k][u])
        continue;
      dfs2(u, k);
    }
  }
}

int dfs3(int v, int k) {
  if (used[v])
    return -1;
  if (v == k)
    return 0;
  used[v] = true;

  int ret = -1;
  for (int u : bs[v]) {
    ret = max(ret, dfs3(u, k));
  }
  if (ret == -1)
    return -1;
  // printf("%d %d: %d\\n", v, k, ret);
  return ret + 1;
}

int main() {
  while (1) {
    scanf("%d", &N);
    if (N == 0)
      return 0;

    mp.clear();
    g_idx = 0;
    for (int i = 0; i < N; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      bs[a].emplace_back(b);
      bs[b].emplace_back(a);
      es[a].emplace_back(b);
      res[b].emplace_back(a);
    }
    printf("%d\\n", g_idx);

    for (int i = 0; i < g_idx; i++) {
      par[i] = i;
      myrank[i] = 0;
      for (int j = 0; j < g_idx; j++) {
        isr[i][j] = false;
        isr2[i][j] = false;
      }
    }

    for (int i = 0; i < g_idx; i++) {
      dfs1(i, i);
    }

    for (int i = 0; i < g_idx; i++) {
      for (int u : es[i]) {
        for (int v : es[i]) {
          if (!isr[u][v] && !isr[v][u])
            unite(u, v);
        }
      }

      for (int u : res[i]) {
        for (int v : res[i]) {
          if (!isr[u][v] && !isr[v][u])
            unite(u, v);
        }
      }
    }

    for (int i = 0; i < g_idx; i++) {
      vs[root(i)].emplace_back(i);
    }

    for (int i = 0; i < g_idx; i++) {
      dfs2(i, i);
    }

    scanf("%d", &M);
    for (int i = 0; i < M; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      // for (int i=0; i<g_idx; i++) used[i] = false;
      // printf("%d %d : %d\\n", a, b, dfs3(a, b));
      for (int i = 0; i < g_idx; i++)
        used[i] = false;
      if (isr2[a][b] && dfs3(a, b) % 2 == 1)
        puts("YES");
      else
        puts("NO");
    }

    for (int i = 0; i < g_idx; i++) {
      es[i].clear();
      res[i].clear();
      bs[i].clear();
      vs[i].clear();
    }
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

using Pair = pair<int, int>;

int N;
int M;
int g_idx;
char buf[114514];
int par[4145];
int myrank[4145];
bool used[4145];
bool isr[4145][4145];
bool isr2[4145][4145];

vector<int> vs[4145];
vector<int> es[4145];
vector<int> res[4145];
vector<int> bs[4145];
map<string, int> mp;

int root(int v) {
  if (par[v] == v)
    return v;
  return par[v] = root(par[v]);
}

void unite(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b)
    return;
  if (myrank[a] < myrank[b])
    par[a] = b;
  else if (myrank[b] < myrank[a])
    par[b] = a;
  else {
    par[a] = b;
    myrank[a]++;
  }
}

Pair GetIdx(string &s) {
  auto itr = s.find('-');
  string a;
  a.assign(s, 0, itr);
  string b;
  b.assign(s, itr + 1, s.size() - itr - 1);
  if (!mp.count(a))
    mp[a] = g_idx++;
  if (!mp.count(b))
    mp[b] = g_idx++;
  return Pair(mp[a], mp[b]);
}

void dfs1(int v, int k) {
  isr[k][v] = true;
  for (int u : es[v]) {
    if (isr[k][u])
      continue;
    dfs1(u, k);
  }
}

void dfs2(int v, int k) {
  for (int dv : vs[root(v)]) {
    isr2[k][dv] = true;
    for (int u : es[dv]) {
      if (isr2[k][u])
        continue;
      dfs2(u, k);
    }
  }
}

int dfs3(int v, int k) {
  if (used[v])
    return -1;
  if (v == k)
    return 0;
  used[v] = true;

  int ret = -1;
  for (int u : bs[v]) {
    ret = max(ret, dfs3(u, k));
  }
  if (ret == -1)
    return -1;
  // printf("%d %d: %d\\n", v, k, ret);
  return ret + 1;
}

int main() {
  while (1) {
    scanf("%d", &N);
    if (N == 0)
      return 0;

    mp.clear();
    g_idx = 0;
    for (int i = 0; i < N; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      bs[a].emplace_back(b);
      bs[b].emplace_back(a);
      es[a].emplace_back(b);
      res[b].emplace_back(a);
    }
    printf("%d\\n", g_idx);

    for (int i = 0; i < g_idx; i++) {
      par[i] = i;
      myrank[i] = 0;
      for (int j = 0; j < g_idx; j++) {
        isr[i][j] = false;
        isr2[i][j] = false;
      }
    }

    for (int i = 0; i < g_idx; i++) {
      vs[i].clear();
      dfs1(i, i);
    }

    for (int i = 0; i < g_idx; i++) {
      for (int u : es[i]) {
        for (int v : es[i]) {
          if (!isr[u][v] && !isr[v][u])
            unite(u, v);
        }
      }

      for (int u : res[i]) {
        for (int v : res[i]) {
          if (!isr[u][v] && !isr[v][u])
            unite(u, v);
        }
      }
    }

    for (int i = 0; i < g_idx; i++) {
      vs[root(i)].emplace_back(i);
    }

    for (int i = 0; i < g_idx; i++) {
      dfs2(i, i);
    }

    scanf("%d", &M);
    for (int i = 0; i < M; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      // for (int i=0; i<g_idx; i++) used[i] = false;
      // printf("%d %d : %d\\n", a, b, dfs3(a, b));
      for (int i = 0; i < g_idx; i++)
        used[i] = false;
      if (isr2[a][b] && dfs3(a, b) % 2 == 1)
        puts("YES");
      else
        puts("NO");
    }

    for (int i = 0; i < g_idx; i++) {
      es[i].clear();
      res[i].clear();
      bs[i].clear();
    }
  }
}