Submission #1007838

#TimeUsernameProblemLanguageResultExecution timeMemory
1007838amirhoseinfar1385Vinjete (COI22_vinjete)C++17
100 / 100
886 ms484260 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
struct yal{
	int u,v,l,r;
	int getad(int fu){
		return (fu^u^v);
	}
}alle[maxn];
vector<int>adj[maxn];
int n,m,kaf=(1<<30),res[maxn];
struct node{
	int mina,lazy,ted,cl,cr,l,r;
	node(){
		mina=lazy=ted=0;
		cl=cr=-1;
	}
}fakenode;

struct segment{
	vector<node>seg;
	segment(){
		seg.resize(2);
		seg[1].l=0;
		seg[1].r=kaf-1;
		seg[1].ted=kaf;
	}
	int getl(int i){
		if(seg[i].cl==-1){
			seg.push_back(fakenode);
			seg[i].cl=(int)seg.size()-1;
			seg.back().l=seg[i].l;
			seg.back().r=(seg[i].l+seg[i].r)/2;
			seg.back().ted=seg.back().r-seg.back().l+1;
		}
		return seg[i].cl;
	}
	int getr(int i){
		if(seg[i].cr==-1){
			seg.push_back(fakenode);
			seg[i].cr=(int)seg.size()-1;
			seg.back().l=(seg[i].l+seg[i].r)/2+1;
			seg.back().r=seg[i].r;
			seg.back().ted=seg.back().r-seg.back().l+1;
		}
		return seg[i].cr;
	}
	node comp(node a,node b){
		if(a.mina<b.mina){
			return a;
		}
		if(b.mina<a.mina){
			return b;
		}
		b.ted+=a.ted;
		return b;
	}
	void calc(int i){
		if(seg[i].l==seg[i].r){
			seg[i].mina+=seg[i].lazy;
			seg[i].lazy=0;
			return ;
		}
		auto x=comp(seg[getl(i)],seg[getr(i)]);
		seg[i].mina=x.mina;
		seg[i].ted=x.ted;
		seg[i].mina+=seg[i].lazy;
	}
	void shift(int i){
		if(seg[i].l==seg[i].r){
			return ;
		}
		seg[getl(i)].lazy+=seg[i].lazy;
		seg[getr(i)].lazy+=seg[i].lazy;
		calc(getl(i));
		calc(getr(i));
		seg[i].lazy=0;
		return ;
	}
	void add(int i,int l,int r,int tl,int tr,int w){
		if(l>r||l>tr||r<tl||tl>tr){
			return ;
		}
		if(l>=tl&&r<=tr){
			seg[i].lazy+=w;
			calc(i);
			//cout<<"wtf: "<<seg[i].lazy<<" "<<seg[i].mina<<" "<<i<<" "<<l<<" "<<r<<endl;
			return ;
		}
		shift(i);
		int m=(l+r)>>1;
		add(getl(i),l,m,tl,tr,w);
		add(getr(i),m+1,r,tl,tr,w);
		calc(i);
	}
	node pors(int i,int l,int r,int tl,int tr){
		if(l>r||l>tr||r<tl||tl>tr){
			node fk;
			fk.mina=maxn+10;
			return fk;
		}
		shift(i);
		calc(i);
		if(l>=tl&&r<=tr){
			//cout<<l<<" "<<r<<" "<<seg[i].mina<<" "<<seg[i].ted<<" "<<seg[i].lazy<<endl;
			return seg[i];
		}
		int m=(l+r)>>1;
		return comp(pors(getl(i),l,m,tl,tr),pors(getr(i),m+1,r,tl,tr));
	}
}seg;

void vorod(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>alle[i].u>>alle[i].v>>alle[i].l>>alle[i].r;
		adj[alle[i].u].push_back(i);
		adj[alle[i].v].push_back(i);
	}
}

void dfssolve(int u,int par=-1){
	node a=seg.pors(1,0,kaf-1,1,m);
	//cout<<u<<" "<<a.mina<<endl;
	if(a.mina!=0){
		a.ted=0;
	}
	res[u]=a.ted;
	for(auto x:adj[u]){
		int v=alle[x].getad(u);
		if(v==par){
			continue;
		}
		seg.add(1,0,kaf-1,alle[x].l,alle[x].r,1);
		dfssolve(v,u);
		seg.add(1,0,kaf-1,alle[x].l,alle[x].r,-1);
	}
}

void solve(){
	dfssolve(1);	
}

void khor(){
	for(int i=2;i<=n;i++){
		res[i]=m-res[i];
		cout<<res[i]<<"\n";
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	//cout.tie(0);
	//freopen("inp.txt","r",stdin);
	vorod();
	solve();
	khor();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...