#pragma GCC optimize ("Ofast") #include #define endl '\n' using namespace std; const int MAXN=1e5+5; const int INF=1e9+5; int bl=300; int n; vector adj[MAXN]; int par[MAXN][20]; int depth[MAXN]; long long c[MAXN]; unordered_map > m; int mn=INF, mx=0; long long clr; int dp[MAXN][2]; void chMin(int &mn1,int &mn2,int val) { if(valmx1) { mx2=mx1; mx1=val; } else if(val>mx2) mx2=val; } void dfs(int v) { if(adj[v].size()==0) { if(c[v]==clr) dp[v][0]=dp[v][1]=0; else dp[v][0]=INF, dp[v][1]=-INF; return; } int mn1,mn2,mx1,mx2; mn1=mn2=INF; mx1=mx2=-INF; for(int i=0;i=0;j--) { if(depth[u]-depth[v]>=(1<=0;j--) { if(par[u][j]!=par[v][j]) { u=par[u][j]; v=par[v][j]; } } return par[u][0]; } void chLCA(int cur) { for(int i=1;i>n; //bl=sqrt(n); for(int i=1;i>u>>v; adj[u].push_back(v); adj[v].push_back(u); } for(int i=1;i<=n;i++) { cin>>c[i]; m[c[i]].push_back(i); } precomp(); for(auto it=m.begin();it!=m.end();it++) { int cur=(*it).first; int cnt=(*it).second.size();//cout<=bl) { chDP(cur); } else { chLCA(cur); } } if(mn==INF || mx==0) cout<<-1<<" "<<-1<