记录编号 251859 评测结果 AAATTTTTTT
题目名称 [HNOI 2016] 网络 最终得分 30
用户昵称 GravatarSatoshi 是否通过 未通过
代码语言 C++ 运行时间 1.980 s
提交时间 2016-04-18 18:51:47 内存使用 25.87 MiB
显示代码纯文本
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define N 200010
#define M 20
using namespace std;
ifstream in("network_tenderRun.in");
ofstream out("network_tenderRun.out");
bool vis[N]={0};
int deep[N]={0};
int p[N][M+5]={0};
vector<int> G[N];
int n,q;
bool broken[N]={0};
int tim[N]={0};
class edge
{
public:
	int u,v,w;
	void make(int a,int b,int c){u=a;v=b;w=c;}
	void print(){out<<u<<' '<<v<<' '<<w<<endl;}
}E[N];
int top=0;
inline int LCA(int u,int v)
{
	int i,d;
	if(deep[u]<deep[v])swap(u,v);
	d=deep[u]-deep[v];
	for(i=0;i<M;i++)if((1<<i)&d)u=p[u][i];
	if(u==v)return u;
	for(i=M-1;i>=0;i--)
	{
		if(p[u][i]!=p[v][i])
		{
			u=p[u][i];
			v=p[v][i];
		}
	}
	u=p[u][0];
	return u;
}
inline int dis(int u,int v)
{
	int fa,ans=0;
	fa=LCA(u,v);
	ans=deep[u]+deep[v]-2*deep[fa];
	return ans;
}
inline bool online(int u,int v,int x)
{
	if(dis(u,x)+dis(v,x)==dis(u,v))return 1;
	return 0;
}
void LCB(int u)
{
	int i;
	vis[u]=1;
	for(i=1;i<M;i++)
	{
		p[u][i]=p[p[u][i-1]][i-1];
		if(!p[u][i])break;
	}
	for(i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(!vis[v])LCB(v);
	}
}
void BFS(int s)
{
	int i,u,v;
	queue<int> q;
	memset(vis,0,sizeof(vis));
	memset(deep,0,sizeof(deep));
	vis[s]=1;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(i=0;i<G[u].size();i++)
		{
			v=G[u][i];
			if(!vis[v])
			{
				vis[v]=1;
				deep[v]=deep[u]+1;
				p[v][0]=u;
				q.push(v);
			}
		}
	}
}
void read()
{
	int i,u,v;
	in>>n>>q;
	for(i=1;i<n;i++)
	{
		in>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
}
void init()
{
	BFS(1);
	memset(vis,0,sizeof(vis));
	LCB(1);
}
void test()
{
	/*int i;
	for(i=1;i<=n;i++)out<<i<<' ';
	out<<endl;
	for(i=1;i<=n;i++)out<<deep[i]<<' ';
	out<<endl;*/
	//out<<online(2,13,6)<<endl;
}
int query(int x)
{
	int i,ans=-1;
	for(i=1;i<=top;i++)
	{
		if(!broken[i])
		{
			if(!online(E[i].u,E[i].v,x))
			{
				ans=max(ans,E[i].w);
			}
		}
	}
	return ans;
}
void work()
{
	int i,type,ti=0;
	for(i=1;i<=q;i++)
	{
		in>>type;
		ti++;
		if(type==0)
		{
			int a,b,v;
			in>>a>>b>>v;
			E[++top].make(a,b,v);
			tim[ti]=top;
			//E[top].print();
		}
		if(type==1)
		{
			int t;
			in>>t;
			//out<<t<<' '<<tim[t]<<endl;
			//out<<tim[t]<<endl;
			broken[tim[t]]=1;
		}
		if(type==2)
		{
			int x;
			in>>x;
			out<<query(x)<<endl;
		}
	}
	/*for(i=1;i<=top;i++)out<<broken[i]<<' ';
	out<<endl;*/
}
int main()
{
	read();
	init();
	work();
	//out<<online()
	//test();
	return 0;
}