9关求调
  • 板块CF487E Tourists
  • 楼主AKPC
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/27 07:54
  • 上次更新2024/4/27 11:06:41
查看原帖
9关求调
540363
AKPC楼主2024/4/27 07:54
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=6e5+5;
struct node {int to,next;} E[N];
vector<int>ans[N],e[N];	 
int n,nn,m,q,a[N];
int cnt,cnt2,num,h[N],Dfn[N],low[N],s[N],sd,r;
bitset<N>tmp;	
inline void add(int x,int y){
	E[++cnt].to=y;
	E[cnt].next=h[x];
	h[x]=cnt;
}
void tarjan(int u){
	Dfn[u]=low[u]=++cnt2,s[++sd]=u;
	if (u==r&&h[u]==0){
		ans[++cnt].push_back(u);
		return;
	}
	for (int v,i=h[u];v=E[i].to,i;i=E[i].next){
		if (!Dfn[v]){
			tarjan(v),low[u]=min(low[u],low[v]);
			if (low[v]>=Dfn[u]){
				cnt++;
				int t;
				do {t=s[sd--],ans[cnt].push_back(t);} while (t!=v);
				ans[cnt].push_back(u);
			} 
		}
		else low[u]=min(low[u],Dfn[v]);
	}
}
int dep[N],siz[N],fa[N],son[N];
int dfs(int u,int father){
	dep[u]=dep[father]+1;
	fa[u]=father;
	siz[u]=1;
	int maxn=-1;
	for (auto v:e[u]){
		if (v==father) continue;
		int sizes=dfs(v,u);
		siz[u]+=sizes;
		if (sizes>maxn) maxn=sizes,son[u]=v;
	}
	return siz[u];
}
int minn[N],rel[N];
int dfn[N],top[N],tip=0;
void dfs2(int u,int father,int op){
	if (op==1) top[u]=top[father];
	dfn[u]=++tip,rel[tip]=u;
	if (son[u]!=0) dfs2(son[u],u,1);
	for (auto v:e[u]){
		if (v==father||v==son[u]) continue;
		dfs2(v,u,0);
	}
}
void init(int root){
	dfs(root,0);
	for (int i=1;i<=n;i++) top[i]=i;
	dfs2(root,0,0);
}
multiset<int>st[N];
struct sgm{
	void build(int x,int l,int r){
		if (l==r){
			minn[x]=a[rel[l]];
			return;
		}
		int mid=(l+r)/2;
		build(x*2,l,mid);
		build(x*2+1,mid+1,r);
		minn[x]=min(minn[x*2],minn[x*2+1]);
	}
	int query(int o,int l,int r,int x,int y){
		if (x<=l&&r<=y) return minn[o];
		int mid=l+r>>1,ret=INT_MAX;
		if (x<=mid) ret=min(ret,query(o<<1,l,mid,x,y));
		if (mid<y) ret=min(ret,query(o<<1|1,mid+1,r,x,y));
		return ret;
	}
	void update(int x,int l,int r,int L,int k){
		if (l==r){
			minn[x]=k;
			return;
		}
		int mid=(l+r)/2;
		if (L<=mid) update(x*2,l,mid,L,k);
		else update(x*2+1,mid+1,r,L,k);
		minn[x]=min(minn[x*2],minn[x*2+1]);
	}
}book;
int qpm(int x,int y){
	int res=1e18;
	while (top[x]!=top[y]){
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		res=min(res,book.query(1,1,n,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if (dep[x]>dep[y]) swap(x,y);
	res=min(res,book.query(1,1,n,dfn[x],dfn[y]));
	if (x>y) res=min(res,a[fa[x]]);
	return res;
}
signed main(){
	n=nn=read(),m=read(),q=read();
	for (int i=1;i<=n;i++){
		a[i]=read();
	}
	for (int i=1;i<=m;i++){
		int x=read(),y=read();
		if (x==y) continue;
		add(x,y),add(y,x);
	}
	cnt=0;
	for (int i=1;i<=n;i++)
		if (Dfn[i]==0){
			r=i;
			tarjan(i);
		}
	for (int i=1;i<=cnt;i++){
		for (auto j:ans[i]){
			e[n+i].push_back(j);
			e[j].push_back(n+i);
		}
	}
	n+=cnt;
	init(1);
	for (int i=1;i<=n;i++)
		if (fa[i]) st[fa[i]].insert(a[i]);
	for (int i=n;i>n-cnt;i--) a[i]=*st[i].begin();
	book.build(1,1,n);
	while (q--){
		char ch;cin>>ch;
		if (ch=='C'){
			int x=read(),c=read();
			if (fa[x]){
				int i=fa[x];
				st[i].erase(st[i].lower_bound(a[x]));
				st[i].insert(c);
				if (a[i]==*st[i].begin()) continue;
				a[i]=*st[i].begin();
				book.update(1,1,n,dfn[i],a[i]);
			}
			a[x]=c;
			book.update(1,1,n,dfn[x],c);
		}
		else{
			int x=read(),y=read();
			cout<<qpm(x,y)<<'\n';
		}
	}
	return 0;
}
2024/4/27 07:54
加载中...