| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1210047 | Fatonim | Vinjete (COI22_vinjete) | C++20 | 0 ms | 0 KiB | 
#include <bits/stdc++.h>
using namespace std;
#ifdef ONPC
#include "debug.h"
#else
#define dbg(...)
#endif
#define ll long long
// #define int long long
#define ld long double
#define pi pair<int, int>
#define sz(a) ((int)(a.size()))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define sqr(n) ((n) * (n))
#define divup(a, b) (((a) + (b)-1) / (b))
#define popcount(n) __builtin_popcountll(n)
#define clz(n) __builtin_clzll(n)
#define Fixed(a) cout << fixed << setprecision(12) << a;
template <class T> bool chmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template <class T> bool chmax(T& a, const T& b) { return b > a ? a = b, 1 : 0; }
const int mod = 998244353; // 998244353 1e9 + 7
const ll inf = (ll)(1e18) + 7;
const ld eps = 1e-9;
const int B = 32;
const int N = 1000 + 3;
const int logn = 20;
const int maxn = 1e5 + 7;
/////////////////////////solve/////////////////////////
struct node {
    int mn = 0, cnt = 0, add = 0;
    int l = -1, r = -1;
};
int tim = 1;
node tree[maxn * (30 * 2)];
int newnode(int tl, int tr) {
    tree[tim].cnt = tr - tl;
    return tim++;
}
void apply(int v, int tl, int tr, int x) {
    tree[v].mn += x;
    tree[v].add += x;
}
void push(int v, int tl, int tr) {
    int tm = (tl + tr) >> 1;
    if (tree[v].l == -1) {
        tree[v].l = newnode(tl, tm);
        tree[v].r = newnode(tm, tr);
    }
    if (tree[v].add != 0) {
        apply(tree[v].l, tl, tm, tree[v].add);
        apply(tree[v].r, tm, tr, tree[v].add);
        tree[v].add = 0;
    }
}
void pull(int v, int tl, int tr) {
    int lv = tree[v].l, rv = tree[v].r;
    tree[v].mn = min(tree[lv].mn, tree[rv].mn);
    tree[v].cnt = 0;
    if (tree[v].mn == tree[lv].mn) tree[v].cnt += tree[lv].cnt;
    if (tree[v].mn == tree[rv].mn) tree[v].cnt += tree[rv].cnt;
}
void update(int l, int r, int x, int v, int tl, int tr) {
    if (tl >= r || tr <= l) return;
    if (tl >= l && tr <= r) {
        apply(v, tl, tr, x);
        return;
    }
    push(v, tl, tr);
    int tm = (tl + tr) >> 1;
    update(l, r, x, tree[v].l, tl, tm);
    update(l, r, x, tree[v].r, tm, tr);
    pull(v, tl, tr);
}
int rt;
int get() {
    return (tree[rt].mn == 0 ? tree[rt].cnt : 0);
}
vector<pair<int, pi>> g[maxn];
int ans[maxn];
int n, m;
void dfs(int v, int p = -1) {
    ans[v] = m - get();
    for (auto [u, seg] : g[v]) {
        if (u != p) {
            auto [l, r] = seg;
            update(l, r + 1, 1, rt, 0, m);
            dfs(u, v);
            update(l, r + 1, -1, rt, 0, m);
        }
    }
}
void solve() {
    cin >> n >> m;
    for (int i = 1; i < n; ++i) {
        int v, u, l, r;
        cin >> v >> u >> l >> r;
        --v; --u;
        --l; --r;
        g[v].push_back({u, {l, r}});
        g[u].push_back({v, {l, r}});
    }
    rt = newnode(0, m);
    dfs(0);
    for (int i = 1; i < n; ++i) {
        cout << ans[i] << "\n";
    }
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
#ifdef ONPC
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    freopen("error.txt", "w", stderr);
#endif
    solve();
}
