Pagini recente » Cod sursa (job #2339345) | Cod sursa (job #2137693) | Cod sursa (job #771940) | Cod sursa (job #1951540) | Cod sursa (job #2008180)
#include <bits/stdc++.h>
#define MAX_BUFF 65536
using namespace std;
int n, tt[100005], v[100005], m[100005][20], ans[100005], goes[100005];
bool ok[100005], kk[100005];
vector<int> fii[100005], bunici;
char in[MAX_BUFF];
int pos = MAX_BUFF, buff;
char getChar(FILE *f) {
if (pos == MAX_BUFF) {
fread(in, 1, MAX_BUFF, f);
pos = 0;
}
return in[pos++];
}
int freef(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = (result << 3) + (result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
void df(int x)
{
ok[x] = 1;
m[x][0] = tt[x];
int k = 0;
while(m[m[x][k]][k]){
m[x][k+1] = m[m[x][k]][k];
++k;
}
for (vector<int>::iterator it = fii[x].begin(); it != fii[x].end(); ++it)
if(!ok[*it])
df(*it);
}
int df2(int x)
{
if(goes[x] != 0){
ans[x] = df2(goes[x]) + 1;
return ans[x];
}else
return 0;
}
int pw2(int x)
{
int p = 1, i;
for (i = 0; p <= x; ++i)
p *= 2;
return i-1;
}
int main()
{
FILE *f = fopen("cerere.in", "r");
ofstream fout ("cerere.out");
n = freef(f);
for (int i = 1; i <= n; ++i)
v[i] = freef(f);
for (int i = 1; i < n; ++i){
int x, y;
x = freef(f);
y = freef(f);
fii[x].push_back(y);
tt[y] = x;
}
for (int i = 1; i <= n; ++i)
if(tt[i] == 0)
bunici.push_back(i);
for (vector<int>::iterator bunic = bunici.begin(); bunic != bunici.end(); ++bunic)
for (vector<int>::iterator it = fii[*bunic].begin(); it != fii[*bunic].end(); ++it)
df(*it);
for (int i = 1; i <= n; ++i)
if(v[i] != 0){
int nod = i;
int y = v[nod];
while(y){
int pw = pw2(y);
y -= (1<<pw);
nod = m[nod][pw];
}
goes[i] = nod;
kk[nod] = 1;
}
/*for (int i = 1; i <= n; ++i)
if(!kk[i])
df2(i);
for (int i = 1; i <= n; ++i)
fout << ans[i] << " ";*/
fout.close();
return 0;
}