Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vi adj[N], b(N, -1);
- int bfs(int n){
- int visited[n +1] = {0}, lev = -1;
- b.resize(n +1);
- b[1] = 0;
- deque <int> q;
- q.push_back(1), visited[1] = 1;
- while(!q.empty()){
- int cur = q.front();
- q.pop_front();
- for(auto itr:adj[cur]){
- if(!visited[itr]){
- visited[itr] = 1;
- b[itr] = b[cur] +1;
- q.push_back(itr);
- }
- }
- }
- for(int i = 1; i <= n; ++i)
- lev = max(lev, b[i]);
- return lev;
- }
- int32_t main()
- {
- int n, q, u, v, c;
- cin >> n;
- vi a(n +1);
- scnarr(a, n); // input array
- for (int i = 0; i < n -1; ++i){
- cin >> u >> v;
- adj[u].push_back(v);
- adj[v].push_back(u);
- }
- int lev = bfs(n);
- vi level[lev +1];
- // at each index of Level array : elements at that level are pushed
- for(int i = 1; i <= n; ++i){
- level[b[i]].push_back(i);
- }
- vi _min(lev +1, 1000000000000000005);
- //finding min elem in each level and save to the _min array
- for(int i = 0; i <= lev; ++i){
- for(auto itr:level[i]){
- b[itr] = i;
- _min[i] = min(_min[i], a[itr]);
- }
- }
- cin >> q;
- while(q--){
- cin >> c;
- if(c == 1){
- cin >> u >> v;
- a[u] = v;
- _min[b[u]] = 1000000000000000005;
- for(auto itr:level[b[u]]){
- _min[b[u]] = min(_min[b[u]], a[itr]);
- }
- }else{
- cin >> u;
- int i = 0, ans = 1000000000000000005;
- for(; i <= lev; ++i){
- if(_min[i] > u){ //found the level closest to root
- for(auto itr:level[i]){
- if(a[itr] == _min[i]){ //if multiple answers exists take the one with lowest index
- ans = min(ans, itr);
- }
- }
- cout << ans << endl;
- break;
- }
- }
- if(i == lev +1){
- cout << -1 << endl;
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment