Pagini recente » Clasament ojiprep1 | Cod sursa (job #1869714) | Cod sursa (job #117095) | Cod sursa (job #1412445) | Cod sursa (job #993818)
Cod sursa(job #993818)
#include <fstream>
#include <vector>
using namespace std;
const int MAX = 100002;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n, top;
int k[MAX], sol[MAX], s[MAX];
vector <int> v[MAX];
bool b[MAX];
inline void dfs( int x )
{
s[++top] = x;
if ( k[x] )
sol[x] = sol[ s[ top - k[x] ] ] + 1;
for (size_t i = 0; i < v[x].size(); ++ i )
dfs(v[x][i]);
--top;
}
inline void read ()
{
f >> n;
for ( int i = 1; i <= n; i ++ )
f >> k[i];
for ( int i = 1, x, y; i <= n-1; i ++ )
{
f >> x >> y;
v[x].push_back(y);
b[y] = 1;
}
}
inline void solve ()
{
for(int i = 1; i <= n; ++i)
if(!b[i])
dfs(i), i = n;
}
inline void write ()
{
for(int i = 1; i <= n; ++i)
g << sol[i] << " ";
g << "\n";
}
int main()
{
read();
solve();
write();
f.close();
g.close();
return 0;
}