传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3251
没有脑洞做不出来啊……
Code:
#include<bits/stdc++.h>
using namespace std;
int a[100001],fa[100001],dep[100001];
int n,m;
vector<int>G[100001];
void dfs(int u){
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v!=fa[u]){
fa[v]=u;
dep[v]=dep[u]+1;
dfs(v);
}
}
}
int data[55];
void Q(int u,int v){
data[0]=0;
while(data[0]<50&&u!=v){
if(dep[u]<dep[v])swap(u,v);
data[++data[0]]=a[u];
u=fa[u];
}data[++data[0]]=a[u];
if(data[0]==50){puts("Y");return;}
sort(data+1,data+1+data[0]);
for(int i=1;i<=data[0]-2;i++)
if((long long)data[i]+data[i+1]>data[i+2]){puts("Y");return;}
puts("N");
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;++i){
int u,v;scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}dfs(1);
while(m--){
int op,x,y;scanf("%d%d%d",&op,&x,&y);
if(op==0){
Q(x,y);
}else{
a[x]=y;
}
}
}