给定一棵N个节点的树,编号1~N。其中1号节点是根,并且第i个节点的权值是Vi

针对这棵树,小Hi会询问小Ho一系列问题。每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多少。为了增加难度,小Hi可能随时改变其中每个节点的权值。

你能帮助小Ho准确、快速的回答小Hi的问题吗?

Input

第一行一个正整数N。

第二行N个整数,V1, V2, ... VN

第三行n-1个正整数,第i个数Pi表示第i+1号节点的父结点是第Pi号节点。注意1号节点是根。

第四行一个正整数Q,表示有Q个询问/修改权值。

接下来Q行,每行可能有如下两种输入格式:

1 x u

2 x

第一种表示将第x号节点的权值修改为u

第二种表示询问以第x号节点为根的子树中,最小的权值是多少。

对于30%的数据,1 ≤ N, Q ≤ 1000

对于100%的数据,1 ≤ N, Q ≤ 100000, -109 <= Vi, u <= 109

Output

对于每次询问,输出一个整数表示答案。

Sample Input

12
3 5 -1 -2 9 6 2 8 -10 11 8 10
1 1 1 2 4 2 6 7 7 8 8
10
2 3
2 1
2 6
1 11 -5
1 5 -12
2 6
2 4
2 2
2 1
2 7

Sample Output

-1
-10
6
-5
-5
-12
-12
-10

求子树的最小值。单点更新。显然是dfs序,然后按顺序存入线段树里面,由于一颗子树在线段树里的位置相邻,我们可以利用起线段树。

没必要写树剖。由于今天做的几道XOR题太难,我已经疯了。。。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int sa[maxn],Rank[maxn];
int Laxt[maxn],Next[maxn],To[maxn],cnt;
int fa[maxn],a[maxn],sz[maxn],tot=;
int ch[maxn][],Min[maxn];
void add(int u,int v)
{
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
}
int dfs(int u)
{
sz[u]=;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
sa[v]=++tot;
Rank[tot]=v;
sz[u]+=dfs(v);
} return sz[u];
}
void update(int Now)
{
Min[Now]=min(Min[Now<<],Min[Now<<|]);
}
void build(int Now,int L,int R)
{
if(L==R) { Min[Now]=a[Rank[L]]; return ;}
int Mid=(L+R)>>;
build(Now<<,L,Mid);
build(Now<<|,Mid+,R);
update(Now);
}
int query(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R) return Min[Now];
int Mid=(L+R)>>;
if(r<=Mid) return query(Now<<,L,Mid,l,r);
else if(l>Mid) return query(Now<<|,Mid+,R,l,r);
else return min(query(Now<<,L,Mid,l,Mid),query(Now<<|,Mid+,R,Mid+,r));
}
void change(int Now,int L,int R,int x,int val)
{
if(L==R) { Min[Now]=val;return ;}
int Mid=(L+R)>>;
if(x<=Mid) change(Now<<,L,Mid,x,val);
else change(Now<<|,Mid+,R,x,val);
update(Now);
}
int main()
{
int i,j,n,q,x,y,opt;
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&a[i]);
for(i=;i<=n;i++) scanf("%d",&fa[i]),add(fa[i],i);
sa[]=; Rank[]=; dfs(); build(,,n);
scanf("%d",&q);
for(i=;i<=q;i++){
scanf("%d",&opt);
if(opt==) scanf("%d%d",&x,&y),change(,,n,sa[x],y);
else {
scanf("%d",&x);
printf("%d\n",query(,,n,sa[x],sa[x]+sz[x]-));
}
}
return ;
}

HihoCoder1576 子树中的最小权值( dfs序 +线段树 || 树剖)的更多相关文章

  1. 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)

    描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...

  2. POJ-1797.HeavyTransportation(最长路中的最小权值)

    本题思路:最短路变形,改变松弛方式即可,dist存的是源结点到当前结点的最长路的最小权值. 参考代码: #include <cstdio> #include <cstring> ...

  3. ZOJ-2342 Roads 二分图最小权值覆盖

    题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...

  4. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

  5. POJ 3565 Ants 【最小权值匹配应用】

    传送门:http://poj.org/problem?id=3565 Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: ...

  6. POJ 2195 Going Home 【二分图最小权值匹配】

    传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  7. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  8. POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

    题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...

  9. HDU 1853 Cyclic Tour[有向环最小权值覆盖]

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

随机推荐

  1. WCF中常用的binding方式 z

    WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务. WSHttpBinding: 比 Bas ...

  2. cocos2d-x step by step(3) Double Kill

    喏,咱们已经调通hello world 了,然后呢,咱们做一些高大上的东西,那做什么呢,做一个打乒乓球的小东西,啊哈! 这就是最终界面了,没画一个球形  就用一个白色方框代替吧. 啊哈! public ...

  3. jmeter如何在写入jtl文件时同步写入数据库

    参考:1.http://blog.csdn.net/cakushin7433/article/details/53367508    2.http://blog.csdn.net/cakushin74 ...

  4. 手把手教你如何利用Meterpreter渗透Windows系统

    在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...

  5. hough变换检测直线和圆

    图像测量和机器视觉作业: 提取图像中的直线和点的位置坐标,将其按一定顺序编码存入一文本文件,并在原图像上叠加显示出来. 下午实验了一下: 程序环境:vs2013(活动平台为x64)+opencv3.1 ...

  6. Eclipse 安装(Oxygen版本)

    Eclipse 安装(Oxygen版本) Eclipse 最新版本 Eclipse Neon,这个首次鼓励用户使用 Eclipse Installer 来做安装,这是一种由Eclipse Oomph提 ...

  7. 分享ArcGIS Server 10.0修复安装心得

    最近,捣腾了一阵子在xp系统上安装ArcGIS Server10.0(下方均简称server),解决了一些初学者可能面临的problem,给大家贴出来, 希望能够给初学者一些有益的帮助. 我的系统环境 ...

  8. nodejs while-loop

    node-while-loop A while loop alternative for Nodejs based on promises. Install $ npm install --save ...

  9. 简单的看Unicode和UTF-8的区别

    作者:uuspider链接:http://www.zhihu.com/question/23374078/answer/65352538来源:知乎著作权归作者所有,转载请联系作者获得授权. 举一个例子 ...

  10. POJ 3211 Washing Clothes(01背包)

    POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...