Cod sursa(job #3369787)

Utilizator batasAndrei Batis batas Data 22 octombrie 2026 09:43:12
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
using VI = vector<int>;
using VB = vector<bool>;
using VVI = vector<VI>;

ifstream fin("arbore.in");
ofstream fout("arbore.out");

const int MAX_N = 1e5 + 5, INF = 0x3f3f3f3f;
int n, m;
int pos[MAX_N], tin[MAX_N], tout[MAX_N], timer;
VI seg, lazy;
VVI adj;

void ReadInput();
void Solve();
void DFS(int node, int fa);
void Update(int node, int start, int fin, int l, int r, int val);
void PushDown(int node, int start, int fin);

int main()
{
    ReadInput();
    DFS(1, 0);
    Solve();

    return 0;
}

void Solve()
{
    seg = VI(4 * timer + 5, 0);
    lazy = VI(4 * timer + 5, -INF);

    fout << timer << '\n';

    int type, node, sum;
    while (m--)
    {
        fin >> type;

        if (type == 1)
        {
            fin >> node >> sum;

            Update(1, 1, timer, tin[node], tout[node], sum);
        }
        else
        {
            fin >> sum;
        }
    }

    for (int t = 1; t <= 4 * timer; ++t)
        fout << seg[t] << ' ';
}

void Update(int node, int start, int fin, int l, int r, int val)
{
    PushDown(node, start, fin);

    if (r < start || l > fin)
        return;

    if (l <= start && r >= fin)
    {
        lazy[node] = val;
        PushDown(node, start, fin);
        return;
    }

    int mid = (start + fin) / 2;
    Update(2 * node, start, mid, l, r, val);
    Update(2 * node + 1, mid + 1, fin, l, r, val);

    seg[node] = seg[2 * node] + seg[2 * node + 1];
}

void PushDown(int node, int start, int fin)
{
    if (lazy[node] != -INF)
    {
        seg[node] = (fin - start + 1) * lazy[node];

        if (start != fin)
        {
            lazy[2 * node] = lazy[2 * node + 1] = lazy[node];
        }

        lazy[node] = -INF;
    }
}

void DFS(int node, int fa)
{
    tin[node] = ++timer;
    pos[timer] = node;

    for (int nbr : adj[node])
        if (nbr != fa)
            DFS(nbr, node);

    tout[node] = timer;
}

void ReadInput()
{
    fin >> n >> m;

    adj = VVI(n + 1);

    int u, v;
    for (int i = 1; i < n; ++i)
    {
        fin >> u >> v;

        adj[u].push_back(v);
        adj[v].push_back(u);
    }
}