Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define vi vector<int>
- #define vpii vector<pair<int,int>>
- #define N (int)2e5+5
- #define f first
- #define s second
- #define all(x) x.begin(),x.end()
- //#define int long long int
- #define forn(i,n) for(int i=0;i<n;i++)
- #define fore(i,l,r) for(int i=l;i<r;i++)
- #define sz(a) (int)((a).size())
- #define ll long long
- #define ar array
- #define init(arr) memset(arr,0,sizeof(arr))
- int n,q;
- vector<vi> adj;
- int dist[N];
- int parent[N];
- void csort(vector<int> v)
- {
- int cnt[101];
- init(cnt);
- int len=sz(v);
- forn(i,len){
- cnt[v[i]]++;
- }
- fore(i,1,101){
- cnt[i]+=cnt[i-1];
- }
- int b[len];
- init(b);
- for(int i=len-1;i>=0;i--)
- {
- b[cnt[v[i]]-1]=v[i];
- cnt[v[i]]--;
- }
- int MAX=INT_MAX;
- for(int i=1;i<len;i++)
- MAX=min(MAX,abs(b[i]-b[i-1]));
- cout<<MAX<<"\n";
- }
- void lca(int u,int v,int arr[])
- {
- vector<int> list;
- list.pb(arr[u]);
- list.pb(arr[v]);
- bool vis[n+1];
- memset(vis,false,sizeof(vis));
- vis[u]=true;
- vis[v]=true;
- while(u!=v)
- {
- if(dist[u]>dist[v])
- {
- u=parent[u];
- if(!vis[u]){
- list.pb(arr[u]);
- vis[u]=true;
- }
- }
- else
- {
- v=parent[v];
- if(!vis[v]){
- list.pb(arr[v]);
- vis[v]=true;
- }
- }
- if(list.size()>100){
- cout<<0<<"\n";return;}
- }
- csort(list);
- }
- void dfs(int u,int p,int h)
- {
- dist[u]=h;
- parent[u]=p;
- for(int v:adj[u])
- {
- if(v!=p)
- dfs(v,u,h+1);
- }
- }
- void solve()
- {
- cin>>n>>q;
- int arr[n];
- forn(i,n)
- cin>>arr[i];
- adj=vector<vi>(n);
- forn(i,n-1)
- {
- int u,v;
- cin>>u>>v;
- u--;
- v--;
- adj[u].pb(v);
- adj[v].pb(u);
- }
- init(dist);
- init(parent);
- dfs(0,-1,0);
- while(q-->0)
- {
- int u,v;
- cin>>u>>v;
- u--;v--;
- lca(u,v,arr);
- }
- }
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int t;
- cin>>t;
- while(t-->0)
- solve();
- }
Add Comment
Please, Sign In to add comment