Pagini recente » Cod sursa (job #1955265) | Cod sursa (job #3138848) | Cod sursa (job #2690411) | Cod sursa (job #2698928) | Cod sursa (job #1934723)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
#define NMAX 100005
#define INF 0x3f3f3f
using namespace std;
int n, m, v[NMAX], viz[NMAX], nrLanturi, tata[NMAX], marimeArboreIntervale[NMAX];
pair <int, int> greutate[NMAX];
stack <int> s;
vector <int> g[NMAX];
vector <int> lant[NMAX];
vector <int> arbIntervale[NMAX];
void read()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i)
scanf("%d", &v[i]);
int x, y;
for(int i=1; i<=n-1; ++i)
{
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
}
void update(int x, int y)
{
}
int query(int x, int y)
{
return 0;
}
void createLant(int nod)
{
vector <int>::iterator it;
for(it=g[nod].begin(); it!=g[nod].end(); ++it)
if(viz[*it]==0)
{
viz[*it]=1;
greutate[nod].first+=1;
tata[*it]=nod;
createLant(*it);
greutate[nod].first+=greutate[*it].first;
}
int maxim=-1*INF, ok=0, lantMaxim;
for(it=g[nod].begin(); it!=g[nod].end(); ++it)
if(*it!=tata[nod] && greutate[*it].first>maxim)
{
ok=1;
maxim=greutate[*it].first;
lantMaxim=greutate[*it].second;
}
if(ok==0)
{
lant[++nrLanturi].push_back(nod);
greutate[nod].second=nrLanturi;
}
else
{
lant[lantMaxim].push_back(nod);
greutate[nod].second=lantMaxim;
}
}
void build(int nr, int poz, int st, int dr)
{
if(st==dr)
{
arbIntervale[nr][poz]=v[lant[nr][st]];
if(poz>marimeArboreIntervale[nr])
marimeArboreIntervale[nr]=poz;
return;
}
int mij=(st+dr)/2;
build(nr, 2*poz, st, mij);
build(nr, 2*poz+1, mij+1, dr);
arbIntervale[nr][poz]=max(arbIntervale[nr][2*poz], arbIntervale[nr][2*poz+1]);
}
void createArboriDeIntervale()
{
for(int i=1; i<=nrLanturi; ++i)
{
arbIntervale[i].resize((4*lant[i].size()));
build(i, 1, 0, lant[i].size()-1);
for(int j=1; j<=marimeArboreIntervale[i]; ++j)
printf("%d ", arbIntervale[i][j]);
printf("\n");
}
}
int main()
{
freopen("heavypath.in", "r", stdin);
//freopen("heavypath.out", "w", stdout);
read();
viz[1]=1;
createLant(1);
createArboriDeIntervale();
int operatie, x, y;
for(int i=1; i<=m; ++i)
{
scanf("%d%d%d", &operatie, &x, &y);
if(operatie==0)
{
update(x, y);
}
else
{
printf("%d\n", query(x, y));
}
}
return 0;
}