Problem p03662 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < ((int)(n)); i++)
#define reg(i, a, b) for (int i = ((int)(a)); i <= ((int)(b)); i++)
#define irep(i, n) for (int i = ((int)(n)-1); i >= 0; i--)
#define ireg(i, a, b) for (int i = ((int)(b)); i >= ((int)(a)); i--)
typedef long long ll;
typedef pair<ll, ll> mp;
ll MOD = 1e9 + 7;
// LLONG_MIN

int pt[100001], visited[100001] = {};
vector<vector<int>> child(100001);
int DFS(int u) {
  // cout<<"訪問："<<u<<endl;
  pt[u] = 1;
  rep(i, child[u].size()) {
    if (visited[child[u][i]] == 0) {
      visited[child[u][i]] = 1;
      pt[u] += DFS(child[u][i]);
    }
  }
  return pt[u];
}

int main(void) {
  int N, a, b;
  cin >> N;
  rep(i, N - 1) {
    cin >> a >> b;
    child[a].push_back(b);
    child[b].push_back(a);
  }
  // DFSでパスを見つける。真ん中の点以降の部分木の頂点個数を考える。
  visited[1] = 1;
  DFS(1);
  // 大をたどる。
  vector<int> path;
  int u = N;
  path.push_back(N); // 一応
  while (u != 1) {
    rep(i, child[N].size()) {
      if (pt[child[u][i]] > pt[u]) {
        path.push_back(child[u][i]);
        u = child[u][i];
        break; // １個しかないから
      }
    }
  }
  // pathには１が含まれている
  int snuke;
  snuke = pt[path[path.size() / 2 - 1]];
  // cout<<snuke<<endl;
  if (snuke >= N - snuke) {
    cout << "Snuke" << endl;
  } else {
    cout << "Fennec" << endl;
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < ((int)(n)); i++)
#define reg(i, a, b) for (int i = ((int)(a)); i <= ((int)(b)); i++)
#define irep(i, n) for (int i = ((int)(n)-1); i >= 0; i--)
#define ireg(i, a, b) for (int i = ((int)(b)); i >= ((int)(a)); i--)
typedef long long ll;
typedef pair<ll, ll> mp;
ll MOD = 1e9 + 7;
// LLONG_MIN

int pt[100001], visited[100001] = {};
vector<vector<int>> child(100001);
int DFS(int u) {
  // cout<<"訪問："<<u<<endl;
  pt[u] = 1;
  rep(i, child[u].size()) {
    if (visited[child[u][i]] == 0) {
      visited[child[u][i]] = 1;
      pt[u] += DFS(child[u][i]);
    }
  }
  return pt[u];
}

int main(void) {
  int N, a, b;
  cin >> N;
  rep(i, N - 1) {
    cin >> a >> b;
    child[a].push_back(b);
    child[b].push_back(a);
  }
  // DFSでパスを見つける。真ん中の点以降の部分木の頂点個数を考える。
  visited[1] = 1;
  DFS(1);
  // 大をたどる。
  vector<int> path;
  int u = N;
  path.push_back(N); // 一応
  while (u != 1) {
    rep(i, child[u].size()) {
      if (pt[child[u][i]] > pt[u]) {
        path.push_back(child[u][i]);
        u = child[u][i];
        break; // １個しかないから
      }
    }
  }
  // pathには１が含まれている
  int snuke;
  snuke = pt[path[path.size() / 2 - 1]];
  // cout<<snuke<<endl;
  if (snuke >= N - snuke) {
    cout << "Snuke" << endl;
  } else {
    cout << "Fennec" << endl;
  }
  return 0;
}