Submission #1305444

#TimeUsernameProblemLanguageResultExecution timeMemory
1305444vtnooDynamic Diameter (CEOI19_diameter)C++20
Compilation error
0 ms0 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC optimize("inline") 
#pragma GCC target("avx2","sse4.2","popcnt")
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(int i=a,pao=b;i<pao;++i)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
#define int long long
const int MAXN=1e5+9, INF=1e18;
vector<pair<int,int>>adj[MAXN];
vector<int>st[MAXN],lz[MAXN];
unordered_map<int,int>in[MAXN],out[MAXN],rc[MAXN],sig[MAXN];
multiset<int>ms[MAXN];
multiset<int>m;
int n,tim,sz[MAXN],ew[MAXN],z[MAXN],anc[MAXN],tam[MAXN],bst[MAXN],cen[MAXN];
bool rmv[MAXN];
static inline void apply(int root,int v,int x){
	st[root][v]+=x;
	lz[root][v]+=x;
}
static inline void push(int root,int v){
	apply(root,v*2,lz[root][v]);
	apply(root,v*2+1,lz[root][v]);
	lz[root][v]=0;
}
static inline void upd(int root,int ts,int te,int x,int s,int e,int v=1){
	if(e<ts||te<s)return;
	if(ts<=s&&e<=te){
		apply(root,v,x);
		return;
	}else{
		push(root,v);
		int m=(s+e)/2;
		upd(root,ts,te,x,s,m,v*2);
		upd(root,ts,te,x,m+1,e,v*2+1);
		st[root][v]=max(st[root][v*2],st[root][v*2+1]);
	}
}
static inline int que(int root,int ts,int te,int s,int e,int v=1){
	if(e<ts||te<s)return -INF;
	if(ts<=s&&e<=te){
		return st[root][v];
	}else{
		push(root,v);
		int m=(s+e)/2;
		return max(que(root,ts,te,s,m,v*2),que(root,ts,te,m+1,e,v*2+1));
	}
}
static inline void dfs(int u,int root,int top,vector<int>&c,int p=-1){
	in[root][u]=tim++;
	c.pb(u);
	for(auto&[v,i]:adj[u]){
		if(rmv[v]||v==p)continue;
		top=(u==root?v:top);
		z[v]=ew[i];
		rc[root][i]=top;
		sig[root][i]=v;
		dfs(v,root,top,c,u);
	}
	out[root][u]=tim-1;
}
static inline int getSizes(int u,int p=-1){
	sz[u]=1;
	for(auto&[v,i]:adj[u]){
		if(rmv[v]||v==p)continue;
		sz[u]+=getSizes(v,u);
	}
	return sz[u];
}
static inline int getCentroid(int u,int treeSize,int p=-1){
	for(auto[v,i]:adj[u]){
		if(rmv[v]||v==p)continue;
		if(sz[v]>treeSize/2)return getCentroid(v,treeSize,u);
	}
	return u;
}
static inline int centroidDecomposition(int u=1,int p=-1){
	int treeSize=getSizes(u);
	int centroid=getCentroid(u,treeSize); 
	//~ cout<<"======================="<<endl;
	//~ cout<<centroid<<endl;
	rmv[centroid]=true;
	vector<int>c;
	c.reserve(treeSize);
	tim=0;
	dfs(centroid,centroid,-1,c);
	int nn=1;
	while(nn<treeSize)nn*=2;
	tam[centroid]=nn;
	st[centroid].resize(nn*2,0);
	lz[centroid].resize(nn*2,0);
	z[centroid]=0;
	fore(i,0,SZ(c)){
		//~ cout<<c[i]<<" "<<z[c[i]]<<endl;
		upd(centroid,in[centroid][c[i]],out[centroid][c[i]],z[c[i]],0,nn-1);
	}
	//~ cout<<endl;
	for(auto[v,i]:adj[centroid]){
		if(rmv[v])continue;
		//~ cout<<v<<" "<<que(centroid,in[centroid][v],out[centroid][v],0,nn-1)<<endl;
		ms[centroid].insert(que(centroid,in[centroid][v],out[centroid][v],0,nn-1));
	}
	if(p!=-1)anc[centroid]=p;
	int ans=0;
	if(SZ(ms[centroid])==1)ans=*ms[centroid].begin();
	else if(SZ(ms[centroid])>1)ans=*prev(ms[centroid].end())+*prev(prev(ms[centroid].end()));
	bst[centroid]=ans;
	m.insert(bst[centroid]);
	for(auto[v,i]:adj[centroid]){
		if(rmv[v])continue;
		cen[i]=centroidDecomposition(v,centroid);
	}
	return centroid;
}
static inline void updCentroidTree(int centroid,int x,int i){
	if(centroid==0)return;
	ms[centroid].erase(ms[centroid].find(que(centroid,in[centroid][rc[centroid][i]],out[centroid][rc[centroid][i]],0,tam[centroid]-1)));
	upd(centroid,in[centroid][sig[centroid][i]],out[centroid][sig[centroid][i]],x,0,tam[centroid]-1);
	ms[centroid].insert(que(centroid,in[centroid][rc[centroid][i]],out[centroid][rc[centroid][i]],0,tam[centroid]-1));
	int ans=0;
	if(SZ(ms[centroid])==1)ans=*ms[centroid].begin();
	else ans=*prev(ms[centroid].end())+*prev(prev(ms[centroid].end()));
	m.erase(m.find(bst[centroid]));
	bst[centroid]=ans;
	m.insert(bst[centroid]);
	updCentroidTree(anc[centroid],x,i);
}
int32_t main(){FIN;
    int q;
    ll w;
    cin>>n>>q>>w;
    fore(i,0,n-1){
        int u,v;
        ll c;
        cin>>u>>v>>c;
        adj[u].pb({v,i});
        adj[v].pb({u,i});
        ew[i]=c;
    }
    centroidDecomposition();
    //~ fore(i,1,n+1)cout<<bst[i]<<" ";
    //~ cout<<endl;
    //~ if(SZ(ms[5])==1)cout<<*ms[5].begin()<<endl;
	//~ else cout<<*prev(ms[5].end())<<"+"<<*prev(prev(ms[5].end()))<<endl;
    //~ cout<<*prev(m.end())<<endl;
    ll last=0;
    while(q--){
        ll d_, e_;
        cin>>d_>>e_;
        ll d=(d_+last)%(n-1);
        ll e=(e_+last)%w;
        ll diff=e-ew[d];
        ew[d]=e;
		updCentroidTree(anc[cen[d]],diff,d);
		cout<<*prev(m.end())<<endl;
		last=*prev(m.end());
    }
}

Compilation message (stderr)

In file included from /usr/include/c++/13/string:43,
                 from /usr/include/c++/13/bitset:52,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:52,
                 from diameter.cpp:4:
/usr/include/c++/13/bits/allocator.h: In destructor 'constexpr std::_Vector_base<std::pair<long long int, long long int>, std::allocator<std::pair<long long int, long long int> > >::_Vector_impl::~_Vector_impl()':
/usr/include/c++/13/bits/allocator.h:184:7: error: inlining failed in call to 'always_inline' 'constexpr std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = std::pair<long long int, long long int>]': target specific option mismatch
  184 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/13/vector:66,
                 from /usr/include/c++/13/functional:64,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:53:
/usr/include/c++/13/bits/stl_vector.h:133:14: note: called from here
  133 |       struct _Vector_impl
      |              ^~~~~~~~~~~~