#include <bits/stdc++.h> using namespace std; #define f first #define s second int n,q,wyn=1,akt=1,p,k; long long int waga[100010],lol,kappa; vector < pair <int,long long int> > graf[100010]; void dfs1(int jaki,int w,int pop,long long int odl){ if(w!=jaki){ if(waga[w]-odl>lol){ akt=w; lol=waga[w]-odl; } if(waga[w]-odl==lol&&w<akt) akt=w; } //cout<<odl<<" "; for(int i=0;i<graf[w].size();i++){ if(graf[w][i].f!=pop){ dfs1(jaki,graf[w][i].f,w,odl+graf[w][i].s); } } } void dfs2(int jaki,int w, int pop, long long int odl){ if(w!=jaki){ if(waga[w]-odl>lol){ akt=w; lol=waga[w]-odl; } if(waga[w]-odl==lol&&w<akt) akt=w; } for(int i=0;i<graf[w].size();i++){ if((w==p&&graf[w][i].f==k)||(w==k&&graf[w][i].f==p)){ graf[w][i].s=kappa; } if(graf[w][i].f!=pop){ dfs2(jaki,graf[w][i].f,w,odl+graf[w][i].s); } } } int main(){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ scanf("%lld",&waga[i]); } for(int i=1;i<n;i++){ int a,b; long long int x; scanf("%d%d%lld",&a,&b,&x); graf[a].push_back(make_pair(b,x)); graf[b].push_back(make_pair(a,x)); } for(int i=0;i<q;i++){ int type; scanf("%d",&type); if(type==1){ int a; long long int x; scanf("%d%lld",&a,&x); waga[a]=x; lol=-(100000000000002137LL); //cout<<lol<<endl; dfs1(akt,akt,-1,0); printf("%d ",akt); } else { scanf("%d%d%lld",&p,&k,&kappa); lol=-(100000000000002137LL); dfs2(akt,akt,-1,0); printf("%d ",akt); } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include <bits/stdc++.h> using namespace std; #define f first #define s second int n,q,wyn=1,akt=1,p,k; long long int waga[100010],lol,kappa; vector < pair <int,long long int> > graf[100010]; void dfs1(int jaki,int w,int pop,long long int odl){ if(w!=jaki){ if(waga[w]-odl>lol){ akt=w; lol=waga[w]-odl; } if(waga[w]-odl==lol&&w<akt) akt=w; } //cout<<odl<<" "; for(int i=0;i<graf[w].size();i++){ if(graf[w][i].f!=pop){ dfs1(jaki,graf[w][i].f,w,odl+graf[w][i].s); } } } void dfs2(int jaki,int w, int pop, long long int odl){ if(w!=jaki){ if(waga[w]-odl>lol){ akt=w; lol=waga[w]-odl; } if(waga[w]-odl==lol&&w<akt) akt=w; } for(int i=0;i<graf[w].size();i++){ if((w==p&&graf[w][i].f==k)||(w==k&&graf[w][i].f==p)){ graf[w][i].s=kappa; } if(graf[w][i].f!=pop){ dfs2(jaki,graf[w][i].f,w,odl+graf[w][i].s); } } } int main(){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ scanf("%lld",&waga[i]); } for(int i=1;i<n;i++){ int a,b; long long int x; scanf("%d%d%lld",&a,&b,&x); graf[a].push_back(make_pair(b,x)); graf[b].push_back(make_pair(a,x)); } for(int i=0;i<q;i++){ int type; scanf("%d",&type); if(type==1){ int a; long long int x; scanf("%d%lld",&a,&x); waga[a]=x; lol=-(100000000000002137LL); //cout<<lol<<endl; dfs1(akt,akt,-1,0); printf("%d ",akt); } else { scanf("%d%d%lld",&p,&k,&kappa); lol=-(100000000000002137LL); dfs2(akt,akt,-1,0); printf("%d ",akt); } } return 0; } |