#include <bits/stdc++.h>
#include "incursion.h"
using namespace std;
typedef vector<int> vi;
#define f first
#define s second
std::vector<int> mark(std::vector<std::pair<int, int>> F, int safe) {
  safe--;
  int n=F.size()+1;
  vector<vi> adj(n);
  for(auto i: F){
    i.f--;i.s--;
    adj[i.f].push_back(i.s);
    adj[i.s].push_back(i.f);
  }
  vi sz(n);
  function<int(int,int)> get_size=[&](int v, int p)->int{
    sz[v]=1;
    for(auto u: adj[v]){
      if(u==p)continue;
      sz[v]+=get_size(u,v);
    }
    return sz[v];
  };
  get_size(0,-1);
  function<int(int,int,int)> find_ce=[&](int v, int p,int s)->int{
    for(auto u: adj[v]){
      if(u==p)continue;
      if(sz[u]>=s)
        return find_ce(u,v,s);
    }
    return v;
  };
  int ce=find_ce(0,-1,n/2);
  vi marked(n);
  function<int(int, int)> mark_nodes=[&](int v, int p)->int{
    if(v==safe){
      marked[v]=1;
      return 1;
    }
    for(auto u: adj[v]){
      if(u==p)continue;
      marked[v]|=mark_nodes(u,v);
    }
    return marked[v];
  };
  mark_nodes(ce,-1);
  get_size(ce,-1);
  int ce2=find_ce(ce,-1,n/2);
  // cout<<ce<< " "<<ce2<<endl;
  if(ce!=ce2){
    if(marked[ce2])
      marked[ce]=0;
  }
  else{
    marked[ce]=0;
  }
  return marked;
}
void locate(std::vector<std::pair<int, int>> F, int curr, int t) {
  curr--;
  int n=F.size()+1;
  vector<vi> adj(n);
  for(auto i: F){
    i.f--;i.s--;
    adj[i.f].push_back(i.s);
    adj[i.s].push_back(i.f);
  }
  vi sz(n),pa(n);
  function<int(int,int)> get_size=[&](int v, int p)->int{
    // cout<<"{"<<v+1<<","<<p+1<<"}"<<endl;
    sz[v]=1;
    for(auto u: adj[v]){
      if(u==p)continue;
      pa[u]=v;
      sz[v]+=get_size(u,v);
    }
    return sz[v];
  };
  get_size(0,-1);
  function<int(int,int,int)> find_ce=[&](int v, int p,int s)->int{
    for(auto u: adj[v]){
      if(u==p)continue;
      if(sz[u]>s)
        return find_ce(u,v,s);
    }
    return v;
  };
  int ce=find_ce(0,-1,n/2);
  get_size(ce,-1);
  // for(auto i: pa)cout<<i+1<<" ";
  // cout<<endl;
  for(auto u: adj[ce]){
    if(sz[u]>=n/2){
      pa[ce]=u;
    }
  }
  vi used(n);
  // cerr<<"--"<<ce+1<<endl;
  // for(auto i: pa)cout<<i+1<<" ";
  // cout<<endl;
  // int x=100;
  // while(x--){
  while(true){
    used[curr]=1;
    if(t==0){
      t=visit(pa[curr]+1);
      curr=pa[curr];
    }
    else{
      vi tmp;
      for(auto u: adj[curr]){
        if(u==pa[curr]||used[u])continue;
        tmp.push_back(u);
      }
      if(tmp.empty()){
        return;
      }
      sort(tmp.begin(),tmp.end(), [&](int a, int b){return sz[a]>sz[b];});
      t=visit(tmp[0]+1);
      curr=tmp[0];
    }
  }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |