/*我尼玛 又一个min打成max 看了半天....*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
#define inf 0x7fffffff
using namespace std;
int n,m,head[maxn],num,v[maxn],fa[maxn][],c[maxn];
int mii[maxn][],mxx[maxn][],up[maxn][],down[maxn][];
struct node{
int v,pre;
}e[maxn*];
int init(){
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int now,int from,int dep,int val){
fa[now][]=from;c[now]=dep;
mii[now][]=min(val,v[now]);
mxx[now][]=max(val,v[now]);
up[now][]=max(,v[from]-v[now]);
down[now][]=max(,v[now]-v[from]);
for(int i=head[now];i;i=e[i].pre){
if(e[i].v==from)continue;
Dfs(e[i].v,now,dep+,v[now]);
}
}
void Get_fa(){
for(int j=;j<=;j++)
for(int i=;i<=n;i++){
fa[i][j]=fa[fa[i][j-]][j-];
mii[i][j]=min(mii[i][j-],mii[fa[i][j-]][j-]);
mxx[i][j]=max(mxx[i][j-],mxx[fa[i][j-]][j-]);
up[i][j]=max(up[i][j-],up[fa[i][j-]][j-]);
up[i][j]=max(up[i][j],mxx[fa[i][j-]][j-]-mii[i][j-]);
down[i][j]=max(down[i][j-],down[fa[i][j-]][j-]);
down[i][j]=max(down[i][j],mxx[i][j-]-mii[fa[i][j-]][j-]);
}
}
int LCA(int a,int b){
if(c[a]<c[b])swap(a,b);
int t=c[a]-c[b];
for(int i=;i<=;i++)
if((<<i)&t)a=fa[a][i];
if(a==b)return a;
for(int i=;i>=;i--)
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
int Up_lca(int a,int b){
int t=c[a]-c[b],ret=,minner=inf;
for(int i=;i<=;i++)
if((<<i)&t){
ret=max(ret,up[a][i]);
ret=max(ret,mxx[a][i]-minner);
minner=min(minner,mii[a][i]);
a=fa[a][i];
}
return ret;
}
int Down_lca(int a,int b){
int t=c[a]-c[b],ret=,maxxer=;
for(int i=;i<=;i++)
if((<<i)&t){
ret=max(ret,down[a][i]);
ret=max(ret,maxxer-mii[a][i]);
maxxer=max(maxxer,mxx[a][i]);
a=fa[a][i];
}
return ret;
}
int Query_max(int a,int b){
int t=c[a]-c[b],maxxer=v[a];
for(int i=;i<=;i++)
if((<<i)&t){
maxxer=max(maxxer,mxx[a][i]);
a=fa[a][i];
}
return maxxer;
}
int Query_min(int a,int b){
int t=c[a]-c[b],minner=v[a];
for(int i=;i<=;i++)
if((<<i)&t){
minner=min(minner,mii[a][i]);
a=fa[a][i];
}
return minner;
}
int main()
{
n=init();
for(int i=;i<=n;i++)
v[i]=init();
int u,v;
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
memset(mii,,sizeof(mii));
Dfs(,,,);Get_fa();
m=init();
while(m--){
u=init();v=init();
int anc=LCA(u,v);
//printf("%d\n",anc);
int ans=;
ans=max(Up_lca(u,anc),Down_lca(v,anc));
ans=max(ans,Query_max(v,anc)-Query_min(u,anc));
printf("%d\n",ans);
}
return ;
}

codevs 3305 水果姐逛水果街Ⅱ的更多相关文章

  1. 水果姐逛水果街Ⅱ codevs 3305

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB   题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  3. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

    题目:http://codevs.cn/problem/3305/  时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Des ...

  4. CodeVs——T 3305 水果姐逛水果街Ⅱ

    http://codevs.cn/problem/3305/  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  5. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

  6. Codevs 3304 水果姐逛水果街Ⅰ 线段树

    题目: http://codevs.cn/problem/3304/   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 D ...

  7. CodeVs——T 3304 水果姐逛水果街Ⅰ

    http://codevs.cn/problem/3304/ 时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Des ...

  8. 水果姐逛水果街Ⅰ(codevs 3304)

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  9. codevs3305 水果姐逛水果街Ⅱ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  10. codevs3304 水果姐逛水果街

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

随机推荐

  1. HDU 1069 Monkey and Banana(LIS最长上升子序列)

    B - LIS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descripti ...

  2. refreshcontrol 实现下拉刷新的功能

    该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...

  3. uitextfield动态限制输入的字数-b

    1.定义一个事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  4. 转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别

    原文来自于:http://blog.sina.com.cn/s/blog_94c21e8f0101s2ic.html Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和 ...

  5. VSTO:无法安装此应用程序,因为已安装具有相同标识的应用程序

    原文:VSTO:无法安装此应用程序,因为已安装具有相同标识的应用程序 在开发环境(Win7+VS2010+Outlook 2010)上做一个Outlook AddIn,运行Outlook时报如下错误: ...

  6. Android Wear开发 - 卡片通知 - 第一节 : 添加Android Wear通知特性

    一. 前言说明 Android Wear大部分显示形式是卡片的形式,而最简单地支持Android Wear方式就是用通知**Notification**.而实现最简单的,非高度自定义的通知,则只需要在 ...

  7. Unity NGUI实现技能CD效果

    unity版本:4.5.1 NGUI版本:3.6.5 脚本代码:C# 在游戏中经常要实现技能的CD效果,NGUI中已经实现了这个功能,即在button上创建一个半透明的Sprite实现这个功能. 首先 ...

  8. code_analyzer(代码分析助手)

    软件名: code_analyzer 使用c语言 pcre正则库分析源码文件,包括文件中的头文件.宏定义.函数. 用途: 无聊时,可以用来打发下时间. 演示: 对于本源程序的分析结果如下: ##### ...

  9. 【模拟】Codeforces 691A Fashion in Berland

    题目链接: http://codeforces.com/problemset/problem/691/A 题目大意: n个数0或1,要求恰好n-1个1,如果n为1则那个数一定要是1 题目思路: [模拟 ...

  10. 控件treeview使用

    一:实现功能,获得选中节点,在选中节点下添加节点,折叠,展开,删除,得到选中节点下checked项,选中根节点其下节点也选中,图标.上图 二:相关代码 using System; using Syst ...