#include<bits/stdc++.h>
#define ll long long
#define ldb long double
#define fi first
#define se second
#define sza(a) (int)a.size()
#define pir pair<int,int>
#define pirll pair<ll,ll>
using namespace std;
const int maxn = 1e5 + 5;
template <class t1,class t2> inline void maxi(t1 &x,t2 y){if (x < y) x = y;}
template <class t1,class t2> inline void mini(t1 &x,t2 y){if (x > y) x = y;}
struct edge{
	int v = 0,l = 0,r = 0;
};
vector <edge> vec[maxn];
void input(int n,int m){
	for (int i = 1 ; i < n ; i++){
		int u,v,l,r;
		cin >> u >> v >> l >> r;
		vec[u].push_back({v,l,r});
		vec[v].push_back({u,l,r});
	}
}
namespace subfull{
	vector <int> seg(1),f(1),L(1),R(1);
	
	int res[maxn];
	
	void update(int l,int r,int v,int lx,int rx,int val){
		//create two new child nodes
		if (l != r){
			if (!L[v]){
				L[v] = seg.size();
				L.push_back(0);
				R.push_back(0);
				seg.push_back(0);
			    f.push_back(0);
			}
			if (!R[v]){
				R[v] = seg.size();
				L.push_back(0);
				R.push_back(0);
				seg.push_back(0);
				f.push_back(0);
			}
	    }
		//////////
		
		if (l > rx || r < lx) return;
		if (l >= lx && r <= rx){
			f[v] += val;
			
			if (!f[v]) seg[v] = (l == r) ? 0 : (seg[L[v]] + seg[R[v]]);
			if (f[v]) seg[v] = r - l + 1;
			
			return;
		}
		
		int w = (l + r)/2;
		update(l,w,L[v],lx,rx,val);
		update(w + 1,r,R[v],lx,rx,val);
		seg[v] = (f[v]) ? (r - l + 1) : (seg[L[v]] + seg[R[v]]);
	}
	
	int calc(){
		return seg[0];
	}
	
	void dfs(int u,int par,int lx,int rx,int m){
		if (u > 1){
			update(1,m,0,lx,rx,1);
			res[u] = calc();
		}
		
		for (edge e : vec[u])
		   if (e.v != par){
		   	   int v = e.v,l = e.l,r = e.r;
		   	   dfs(v,u,l,r,m);
		   }
		
		if (u > 1)
		   update(1,m,0,lx,rx,-1);
	}
	
	void solve(int n,int m){
		dfs(1,0,0,0,m);
		seg.clear();L.clear(),R.clear(),f.clear();
		
		for (int u = 2 ; u <= n ; u++) cout << res[u] << "\n";
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
//	freopen("HIGHWAY.inp","r",stdin);
//	freopen("HIGHWAY.out","w",stdout);
	
	int n,m;
	cin >> n >> m;
	input(n,m);
	
	//subfull : from subtask4, dynamic segment tree
	subfull::solve(n,m);
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |