#include #define mk make_pair #define fs first #define sc second using namespace std; typedef long long ll; typedef long double ld; vector a[100010]; int par[100010], cnt, in[100010], out[100010], elr[100010], mx[100010]; vector < pair > v[100010]; pair dfs1(int x, int papa){ int nxt; pair tmp; for(int i=0; i tmp){ int nxt; if(papa!=-1){ v[x].push_back(mk(tmp.fs, papa)); v[x].push_back(mk(tmp.sc, papa)); } sort(v[x].begin(), v[x].end()); reverse(v[x].begin(), v[x].end()); vector c; for(int i=0; i val; void push(int & x, int & y, int & z, int & c){ if(z>x){ y=max(x, c); x=z; } else if(zrt||ndval.fs) return; if(st>=lf&&nd<=rt){ push(pr1[x],pr2[x],val.fs,val.sc); return; } int md=(st+nd)/2; push(pr1[x*2],pr2[x*2],pr1[x],pr2[x]); push(pr1[x*2+1],pr2[x*2+1],pr1[x],pr2[x]); updt(x*2, st, md);updt(x*2+1, md+1, nd); } void init(int x, int st, int nd){ pr1[x]=pr2[x]=-1; if(st==nd){ return; } int md=(st+nd)/2; init(x*2, st, md);init(x*2+1, md+1, nd); } int qry(int x, int st, int nd){ if(st>rt||nd c; for(int i=0; i>tt; while(tt--){ int n, m, x, y; cin>>n>>m; for(int i=0; i<=n; ++i){ a[i].clear(); v[i].clear(); } for(int i=0; i