제출 #223672

#제출 시각아이디문제언어결과실행 시간메모리
223672ryanseeDynamic Diameter (CEOI19_diameter)C++14
49 / 100
5051 ms213616 KiB
#include "bits/stdc++.h"
using namespace std;

#define FAST ios_base::sync_with_stdio(false); cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second
#define cbr cerr << "hi\n"
#define mmst(x, v) memset((x), v, sizeof ((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x,y) (lower_bound(all(x),y)-x.begin())
#define ubd(x,y) (upper_bound(all(x),y)-x.begin())
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());    //can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) { return (rng() % (y+1-x)) + x; } //inclusivesss
string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); }

typedef long long ll; 
typedef long double ld;
#define FOR(i,s,e) for(ll i=s;i<=ll(e);++i)
#define DEC(i,s,e) for(ll i=s;i>=ll(e);--i)
typedef pair<ll,ll>pi; typedef pair<ll,pi>spi; typedef pair<pi,pi>dpi;

#define LLINF ((long long)4e18+1000)
#define INF int(1e9+1e6)
#define MAXN (100006)
ll n,q,w;
int bck[MAXN],st[MAXN],en[MAXN],co,p[MAXN][17],depth[MAXN];
vector<pair<int,ll>> v[MAXN];
spi e[MAXN];
pi def=pi(-LLINF,-1);
struct node{
	int s,e,m;
	pair<ll,int> v;
	ll add;
	node*l,*r;
	node(int S,int E){
		s=S,e=E,m=(s+e)>>1;
		v.f=v.s=add=0;
		if(s^e)l=new node(s,m),r=new node(m+1,e);
	}
	void update(int x,int y,ll nval){
		if(x>y)return;
		if(s==x&&e==y) {
			add+=nval;
			return;
		}
		if(x>m)r->update(x,y,nval);
		else if(y<=m)l->update(x,y,nval);
		else l->update(x,m,nval),r->update(m+1,y,nval);
		v=max(l->value(),r->value());
	}
	pair<ll,int> value() {
		v.f+=add;
		if(s^e){
			l->add+=add;
			r->add+=add;
		}
		add=0;
		return v;
	}
	void set(int x,pair<ll,int> nval){
		value();
		if(s==e) {
			v=nval;
			return;
		}
		if(x>m)r->set(x,nval); else l->set(x,nval);
		v=max(l->value(),r->value());
	}
	pair<ll,int> rmq(int x,int y){
		if(x>y) return def;
		value();
		if(s==x&&e==y) return v;
		if(x>m) return r->rmq(x,y);
		else if(y<=m) return l->rmq(x,y);
		else return max(l->rmq(x,m),r->rmq(m+1,y));
	}
	pair<ll,int> exc_rmq(int x,int y){
		return max(rmq(s,x-1),rmq(y+1,e));
	}
	void exc_upd(int x,int y,ll nval){
		update(s,x-1,nval), update(y+1,e,nval);
	}
} *seg[MAXN];
struct fen {
	ll fw[MAXN];
	void pupdate(int x,ll nval) {
		for(;x<MAXN;x+=x&(-x)) fw[x]+=nval;
	}
	void update(int x,int y,ll nval){
		pupdate(x,nval),pupdate(y+1,-nval);
	}
	ll sum(int x){
		ll res=0;
		for(;x;x-=x&(-x)) res+=fw[x];
		return res;
	}
} dist;
void dfs(int x,int par,ll d){
	bck[co]=x, st[x]=co++;
	dist.update(st[x],st[x],d);
	p[x][0]=par;
	for(auto i:v[x]) if(i.f^par) {
		depth[i.f]=depth[x]+1, dfs(i.f,x,d+i.s);
	}
	en[x]=co-1;
}
bool isp(int a,int b) { return st[a]<=st[b]&&en[a]>=en[b]; }
int lca(int x,int y){
	if(isp(x,y))return x;
	if(isp(y,x))return y;
	DEC(i,16,0)if(!isp(p[x][i],y))x=p[x][i];
	return p[x][0];
}
ll disty(int a,int b) { return dist.sum(st[a]) + dist.sum(st[b]) - 2 * dist.sum(st[lca(a,b)]); }
int kpar(int x,int k){
	FOR(i,0,16) if(1<<i&k) {
		x=p[x][i];
	}
	return x;
}
int sz[MAXN], total, cp[MAXN];
bitset<MAXN> done;
vector<int> kids[MAXN];
void dfs1(int x,int p){
	sz[x]=1;
	++ total;
	for(auto i:v[x]) if(!done[i.f]&&i.f!=p){
		dfs1(i.f,x);
		sz[x]+=sz[i.f];
	}
}
int dfs2(int x,int p){
	for(auto i:v[x]) if(!done[i.f]&&i.f!=p&&sz[i.f]>total/2) return dfs2(i.f,x);
	return x;
}
int X;
void get_des(int x,int p){
	kids[X].pb(st[x]);
	for(auto i:v[x]) if(i.f!=p && !done[i.f]) get_des(i.f,x);
}
void dfs3(int x,int p){
	total=0;
	dfs1(x,x);
	x=dfs2(x,x);
	cp[x]=p;
	done[x]=1;
	X=x, get_des(x,x), sort(all(kids[x]));
	seg[x]=new node(0,siz(kids[x])-1);
	FOR(i,0,siz(kids[x])-1)seg[x]->set(i,pi(disty(bck[kids[x][i]],x),bck[kids[x][i]]));
	for(auto i:v[x]) if(!done[i.f]) dfs3(i.f,x);
	v[x].clear();
}
void upd(int x,int o,ll diff){
	if(x==-1) return;
	if(isp(o,x)) { // in subtre of o, exc_upd
		seg[x]->exc_upd(lbd(kids[x],st[o]),ubd(kids[x],en[o])-1,diff);
	}else{
		seg[x]->update(lbd(kids[x],st[o]),ubd(kids[x],en[o])-1,diff);
	}
	upd(cp[x],o,diff);
}
inline pair<ll,int> add(pair<ll,int> ans,ll x){
	return {ans.f+x,ans.s};
}
pair<ll,int> query(ll x,ll o){
	if(x==-1) return def;
	if(!isp(x,o)){
		return max(query(cp[x],o), add(seg[x]->rmq(lbd(kids[x],st[x]),ubd(kids[x],en[x])-1),disty(x,o)));
	}else{
		ll inter = kpar(o,depth[o]-depth[x]-1);
		return max(query(cp[x],o), add(seg[x]->exc_rmq(lbd(kids[x],st[inter]),ubd(kids[x],en[inter])-1),disty(x,o)));
	}
}
int main(){
	FAST
	cin>>n>>q>>w;
	FOR(i,0,n-2){
		cin>>e[i].s.f>>e[i].s.s>>e[i].f;
		v[e[i].s.f].eb(e[i].s.s,e[i].f), v[e[i].s.s].eb(e[i].s.f,e[i].f);
	}
	co=1, dfs(1,1,0);
	FOR(j,1,16)FOR(i,1,n)p[i][j]=p[p[i][j-1]][j-1];
	dfs3(1,-1);
	ll d1=1,d2=1,best=0,pans=0;
	FOR(i,1,n) {
		pi tryy=query(i,i);
		if(tryy.f>best) best=tryy.f, d1=i, d2=tryy.s;
	}
	cerr<<"best: "<<best<<'\n';
	FOR(i,1,q){
		ll eg,ncost;
		cin>>eg>>ncost;
		eg+=pans,eg%=n-1,ncost+=pans,ncost%=w;
		ll a=e[eg].s.f, b=e[eg].s.s;
		if(p[a][0]==b) swap(a,b);
		upd(b,b,ncost-e[eg].f);
		dist.update(st[b],en[b],ncost-e[eg].f);
		e[eg].f=ncost;
		best=disty(d1,d2);
		ll od1=d1,od2=d2;
		pi hmm=query(od1,od1);
		if(hmm.f>best) best=hmm.f, d1=od1, d2=hmm.s;
		hmm=query(od2,od2);
		if(hmm.f>best) best=hmm.f, d1=hmm.s, d2=od2;
		cout<<(pans=best)<<'\n';		
	}
	
}
/*
4 2 2000
1 2 100
2 3 1000
2 4 1000
2 1030
1 1020
*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...