#include<cstdio>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef long long int lld;
struct graf{
vector<int> droga;
int odw;
lld v;
lld odl;
graf(void){
odw=-1;
}
};
map<pair<int,int>,lld> m;
graf g[100005];
void bfs(int v, int nr){
g[v].odl=0;
g[v].odw=nr;
queue<int> q;
q.push(v);
while(!q.empty()){
int w=q.front();
q.pop();
for(int i=0;i<g[w].droga.size();i++)
if(g[g[w].droga[i]].odw != nr){
int u=g[w].droga[i];
g[u].odw=nr;
g[u].odl=g[w].odl+m[make_pair(min(w,u),max(w,u))];
q.push(u);
}
}
return;
}
int main(void){
int n,q;
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
scanf("%lld",&g[i].v);
for(int i=0;i<n-1;i++){
int a,b;
lld v;
scanf("%d%d%lld",&a,&b,&v);
a--, b--;
g[a].droga.push_back(b);
g[b].droga.push_back(a);
m[make_pair(min(a,b),max(a,b))]=v;
}
int akt=0;
for(int i=0;i<q;i++){
int z;
scanf("%d",&z);
if(z==1){
int v;
lld d;
scanf("%d%lld",&v,&d);
g[v-1].v=d;
}else{
int a,b;
lld d;
scanf("%d%d%lld",&a,&b,&d);
a--, b--;
m[make_pair(min(a,b),max(a,b))]=d;
}
bfs(akt,i);
int p=0;
int a=akt;
if(akt==0)
p=1;
akt=p;
lld odl=g[p].v-g[p].odl;
for(lld i=p+1;i<n;i++)
if(a!=i && g[i].v-g[i].odl > odl){
odl=g[i].v-g[i].odl;
akt=i;
}
printf("%d ",akt+1);
}
printf("\n");
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include<cstdio> #include<vector> #include<map> #include<queue> using namespace std; typedef long long int lld; struct graf{ vector<int> droga; int odw; lld v; lld odl; graf(void){ odw=-1; } }; map<pair<int,int>,lld> m; graf g[100005]; void bfs(int v, int nr){ g[v].odl=0; g[v].odw=nr; queue<int> q; q.push(v); while(!q.empty()){ int w=q.front(); q.pop(); for(int i=0;i<g[w].droga.size();i++) if(g[g[w].droga[i]].odw != nr){ int u=g[w].droga[i]; g[u].odw=nr; g[u].odl=g[w].odl+m[make_pair(min(w,u),max(w,u))]; q.push(u); } } return; } int main(void){ int n,q; scanf("%d%d",&n,&q); for(int i=0;i<n;i++) scanf("%lld",&g[i].v); for(int i=0;i<n-1;i++){ int a,b; lld v; scanf("%d%d%lld",&a,&b,&v); a--, b--; g[a].droga.push_back(b); g[b].droga.push_back(a); m[make_pair(min(a,b),max(a,b))]=v; } int akt=0; for(int i=0;i<q;i++){ int z; scanf("%d",&z); if(z==1){ int v; lld d; scanf("%d%lld",&v,&d); g[v-1].v=d; }else{ int a,b; lld d; scanf("%d%d%lld",&a,&b,&d); a--, b--; m[make_pair(min(a,b),max(a,b))]=d; } bfs(akt,i); int p=0; int a=akt; if(akt==0) p=1; akt=p; lld odl=g[p].v-g[p].odl; for(lld i=p+1;i<n;i++) if(a!=i && g[i].v-g[i].odl > odl){ odl=g[i].v-g[i].odl; akt=i; } printf("%d ",akt+1); } printf("\n"); return 0; } |
English