#include #define MAXN 100001 #define LOGN 18 using namespace std; int n,col[MAXN],ind,ansmn=INT_MAX-1,ansmx=0; unordered_map m; vector rebra[MAXN]; int cv[3][MAXN],par[MAXN],dul[MAXN],jump[MAXN][LOGN],pred[MAXN]; int lca(int x,int y){ if(dul[x]=0;i--){ if(jump[x][i]!=jump[y][i]){ x=jump[x][i]; y=jump[y][i]; } } return jump[x][0]; } void dfs(int x,int p){ if(cv[0][col[x]]==0){ cv[0][col[x]]=x; }else if(cv[1][col[x]]==0){ cv[1][col[x]]=x; int lc1=lca(x,cv[0][col[x]]); cv[2][col[x]]=dul[x]-dul[lc1]+dul[cv[0][col[x]]]-dul[lc1]; }else{ int lc1=lca(x,cv[0][col[x]]); int lc2=lca(x,cv[1][col[x]]); lc1=dul[x]-dul[lc1]+dul[cv[0][col[x]]]-dul[lc1]; lc2=dul[x]-dul[lc2]+dul[cv[1][col[x]]]-dul[lc2]; if(lc2>lc1){ if(lc2>=cv[2][col[x]]){ cv[2][col[x]]=lc2; cv[0][col[x]]=x; } }else{ if(lc1>=cv[2][col[x]]){ cv[2][col[x]]=lc1; cv[1][col[x]]=x; } } } ansmx=max(ansmx,cv[2][col[x]]); for(int i=0;i>n; for(int i=0;i>x>>y; rebra[x].push_back(y); rebra[y].push_back(x); } dfs1(1,0,0); jump[0][0]=0; for(int i1=1;i1>cvt; int istcvt; if(m.find(cvt)!=m.end()){ istcvt=m[cvt]; }else{ m[cvt]=ind; istcvt=ind; ind++; } col[i]=istcvt; } dfs(1,0); if(ansmn==0 || ansmx==0) izhod<<-1<<" "<<-1<<"\n"; else izhod<