Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 5 5
- 1 2
- 2 3
- 3 5
- 2 4
- 12 18 8 2 6
- 8
- 24
- 1
- 5
- 16
- _____ _ _ _ _
- |_ _| |__ ___ / \ _ __ ___| |__ _ _| |
- | | | '_ \ / _ \ / _ \ | '_ \/ __| '_ \| | | | |
- | | | | | | __// ___ \| | | \__ \ | | | |_| | |
- |_| |_| |_|\___/_/ \_\_| |_|___/_| |_|\__,_|_|
- */
- #include<bits/stdc++.h>
- #define ll long long
- #define pb push_back
- #define endl '\n'
- #define rep(i,a,b) for(ll int i=a;i<b;i++)
- #define vi vector<ll int>
- #define all(a) (a).begin(),(a).end()
- #define F first
- #define S second
- #define sz(x) (ll int)x.size()
- using namespace std;
- #define N 100005
- #define M 1000005
- ll fact[M],v[N],hit[N],dp[M];
- bool vis1[M],vis[N];
- vi a[N];
- void prep()
- {
- rep(i,2,M)
- {
- if(!vis1[i])
- {
- fact[i]=i;
- for(ll j=2*i;j<M;j+=i)
- {
- if(vis1[j]==0)
- {
- vis1[j]=1;
- fact[j]=i;
- }
- }
- }
- }
- }
- void dfs(ll node)
- {
- vis[node]=1;
- for(auto i:a[node])
- {
- if(!vis[i])
- {
- hit[i]=hit[node]+1;
- dfs(i);
- }
- }
- }
- ll fun(ll vl)
- {
- if(vl==1)
- return 1;
- if(dp[vl]!=0)
- return dp[vl];
- vi tmp;
- // cerr<<fact[vl];
- ll pr=fact[vl],cnt=1;
- vl/=fact[vl];
- while(vl!=1)
- {
- if(fact[vl]==pr)
- {
- cnt++;
- }
- else
- {
- tmp.pb(cnt);
- cnt=1;
- pr=fact[vl];
- }
- vl/=fact[vl];
- }
- tmp.pb(cnt);
- ll ans=1;
- rep(i,0,sz(tmp))
- ans*=(tmp[i]+1);
- dp[vl]=ans;
- return ans;
- }
- void solve()
- {
- ll n;
- cin>>n;
- ll q;
- cin>>q;
- prep();
- rep(i,1,n)
- {
- ll x,y;
- cin>>x>>y;
- a[x].pb(y);
- a[y].pb(x);
- }
- rep(i,1,n+1)
- cin>>v[i];
- dfs(1);
- vector<pair<ll,pair<ll,ll>>> st(n);
- rep(i,1,n+1)
- {
- st[i-1].F=fun(v[i]);
- st[i-1].S.F=-hit[i];
- st[i-1].S.S=-i;
- }
- sort(all(st));
- rep(i,0,q)
- {
- ll x;
- cin>>x;
- ll l=0,r=n;
- while(l<=r)
- {
- ll mid=(l+r)/2;
- if(fun(x)<=st[mid].F)
- {
- r=mid-1;
- }
- else
- l=mid+1;
- }
- if(l==0)
- cout<<-1<<endl;
- else
- cout<<-st[l-1].S.S<<endl;
- }
- return;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int TESTS=1;
- // cin>>TESTS;
- while(TESTS--)
- {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement