Guest User

Untitled

a guest
Mar 12th, 2020
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. vi adj[N], b(N, -1);
  2.  
  3. int bfs(int n){
  4.     int visited[n +1] = {0}, lev = -1;
  5.     b.resize(n +1);
  6.     b[1] = 0;
  7.     deque <int> q;
  8.     q.push_back(1), visited[1] = 1;
  9.     while(!q.empty()){
  10.         int cur = q.front();
  11.         q.pop_front();
  12.         for(auto itr:adj[cur]){
  13.             if(!visited[itr]){
  14.                 visited[itr] = 1;
  15.                 b[itr] = b[cur] +1;
  16.                 q.push_back(itr);
  17.             }
  18.         }
  19.     }
  20.     for(int i = 1; i <= n; ++i)
  21.         lev = max(lev, b[i]);
  22.     return lev;
  23. }
  24.  
  25. int32_t main()
  26. {
  27.     int n, q, u, v, c;
  28.     cin >> n;
  29.     vi a(n +1);
  30.     scnarr(a, n); // input array
  31.     for (int i = 0; i < n -1; ++i){
  32.         cin >> u >> v;
  33.         adj[u].push_back(v);
  34.         adj[v].push_back(u);
  35.     }
  36.     int lev = bfs(n);
  37.     vi level[lev +1];
  38.  
  39.     // at each index of Level array : elements at that level are pushed
  40.     for(int i = 1; i <= n; ++i){
  41.         level[b[i]].push_back(i);
  42.     }
  43.  
  44.     vi  _min(lev +1, 1000000000000000005);
  45.  
  46.     //finding min elem in each level and save to the _min array
  47.     for(int i = 0; i <= lev; ++i){
  48.         for(auto itr:level[i]){
  49.             b[itr] = i;
  50.             _min[i] = min(_min[i], a[itr]);
  51.         }
  52.     }
  53.  
  54.     cin >> q;
  55.     while(q--){
  56.         cin >> c;
  57.         if(c == 1){
  58.             cin >> u >> v;
  59.             a[u] = v;
  60.             _min[b[u]] = 1000000000000000005;
  61.             for(auto itr:level[b[u]]){
  62.                 _min[b[u]] = min(_min[b[u]], a[itr]);
  63.             }
  64.         }else{
  65.             cin >> u;
  66.             int i = 0, ans = 1000000000000000005;
  67.             for(; i <= lev; ++i){
  68.                 if(_min[i] > u){ //found the level closest to root
  69.                     for(auto itr:level[i]){
  70.                         if(a[itr] == _min[i]){ //if multiple answers exists take the one with lowest index
  71.                             ans = min(ans, itr);
  72.                         }
  73.                     }
  74.                     cout << ans << endl;
  75.                     break;
  76.                 }
  77.             }
  78.             if(i == lev +1){
  79.                 cout << -1 << endl;
  80.             }
  81.         }
  82.     }
  83.  
  84. }
Add Comment
Please, Sign In to add comment