#include<bits/stdc++.h>
using namespace std;
vector<pair<int,long long> >graf[100007];
long long tab[100007];
bool odwiedzony[100007];
long long roznica[100007];
queue<int>q;
long long odleglosc[100007];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
long long x,y,z,o;
for(int a=1;a<=n;a++)
cin>>tab[a];
for(int a=0;a<n-1;a++)
{
cin>>x>>y>>z;
graf[x].push_back(make_pair(y,z));
graf[y].push_back(make_pair(x,z));
}
int poprzedni=1;
for(int b=0;b<m;b++)
{
cin>>x>>y>>z;
if(x==1)
{
tab[y]=z;
}
else
{
cin>>o;
int a=0;
while(graf[y][a].first!=z)
{
a++;
}
graf[y][a]=make_pair(z,o);
a=0;
while(graf[z][a].first!=y)
{
a++;
}
graf[z][a]=make_pair(y,o);
}
for(int a=0;a<=n;a++)
{
odwiedzony[a]=0;
odleglosc[a]=1000000000000000001;
if(poprzedni==a)
{
odleglosc[a]=0;
}
}
q.push(poprzedni);
odwiedzony[poprzedni]=1;
while(!q.empty())
{
int w=q.front();
q.pop();
for(int a=0;a<graf[w].size();a++)
{
if(odwiedzony[graf[w][a].first]==0)
{
q.push(graf[w][a].first);
odleglosc[graf[w][a].first]=odleglosc[w]+graf[w][a].second;
odwiedzony[graf[w][a].first]=1;
}
}
}
long long ma=-1000000000000000001,nr=0;
for(int a=1;a<=n;a++)
{
roznica[a]=tab[a]-odleglosc[a];
if(ma<roznica[a]&&a!=poprzedni)
{
ma=roznica[a];
nr=a;
}
//cout<<odleglosc[a]<<" ";
}
cout<<nr<<" ";
poprzedni=nr;
}
}
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 | #include<bits/stdc++.h> using namespace std; vector<pair<int,long long> >graf[100007]; long long tab[100007]; bool odwiedzony[100007]; long long roznica[100007]; queue<int>q; long long odleglosc[100007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,m; cin>>n>>m; long long x,y,z,o; for(int a=1;a<=n;a++) cin>>tab[a]; for(int a=0;a<n-1;a++) { cin>>x>>y>>z; graf[x].push_back(make_pair(y,z)); graf[y].push_back(make_pair(x,z)); } int poprzedni=1; for(int b=0;b<m;b++) { cin>>x>>y>>z; if(x==1) { tab[y]=z; } else { cin>>o; int a=0; while(graf[y][a].first!=z) { a++; } graf[y][a]=make_pair(z,o); a=0; while(graf[z][a].first!=y) { a++; } graf[z][a]=make_pair(y,o); } for(int a=0;a<=n;a++) { odwiedzony[a]=0; odleglosc[a]=1000000000000000001; if(poprzedni==a) { odleglosc[a]=0; } } q.push(poprzedni); odwiedzony[poprzedni]=1; while(!q.empty()) { int w=q.front(); q.pop(); for(int a=0;a<graf[w].size();a++) { if(odwiedzony[graf[w][a].first]==0) { q.push(graf[w][a].first); odleglosc[graf[w][a].first]=odleglosc[w]+graf[w][a].second; odwiedzony[graf[w][a].first]=1; } } } long long ma=-1000000000000000001,nr=0; for(int a=1;a<=n;a++) { roznica[a]=tab[a]-odleglosc[a]; if(ma<roznica[a]&&a!=poprzedni) { ma=roznica[a]; nr=a; } //cout<<odleglosc[a]<<" "; } cout<<nr<<" "; poprzedni=nr; } } |
English