#include using namespace std; bool valid(char c) { return '0'<=c&&c<='9'; } void read_int(int &ret) { ret=0; char c=getchar(); while(valid(c)==0)c=getchar(); while(valid(c)) { ret=ret*10+c-'0'; c=getchar(); } } const int nmax=1e6+42; int n,inp[nmax]; int outp[nmax]; vector adj[nmax],before[nmax]; vector my_merge(vector a,vector b) { vector ret(a.size()+b.size()-1,-n-5); for(int i=0;i dfs(int node,int parent) { vector ret={}; if(inp[node]==0) { ret.push_back(coeff[node]); for(auto w:adj[node]) if(w!=parent) { ret=my_merge(ret,dfs(w,node)); } } else { ret.push_back(coeff[node]); for(auto w:adj[node]) if(w!=parent) { ret=my_merge(ret,dfs(w,node)); } ret.insert(ret.begin(),0); } //cout< ";for(auto w:ret)cout< st[nmax]; int pointer=0; void go() { pointer=1; st[pointer]={1,1}; int tp=1; while(tp<=pointer) { int node=st[tp].first; int par=st[tp].second; tp++; //cout<<"go "< "< cur=dfs(1,0); int pos=0; for(int i=1;i