#include<cstdio>
#include<algorithm>
using namespace std;
struct tree
{
int l,r,Max,Min,sum;//用结构体表示每个节点的区间,最大值,最小值,总和。
}Tree[1000<<2];
void push(int o)
{
Tree[o].sum=Tree[2*o].sum+Tree[2*o].sum;//当前结点值由下层两个节点得到
Tree[o].Max=max(Tree[2*o].Max,Tree[2*o+1].Max);
Tree[o].Min=min(Tree[2*o].Min,Tree[2*o+1].Min);
}
void buildtree(int o,int l,int r)
{
Tree[o].l=l;//记录L和R的值
Tree[o].r=r;
if(l==r)//找到最底层
{
int t;
scanf("%d",&t);
Tree[o].Max=Tree[o].Min=Tree[o].sum=t;//对最底层的树赋值
return ;//本次函数调用结束,返回到上层函数调用
}
int mid=l+r>>1;
buildtree(2*o,l,mid);//遍历左子树
buildtree(2*o+1,mid+1,r);//遍历右子树
push(o);//更新当前节点值
}
void update(int o,int l,int r,int x,int y)//将x节点的值修改为y;
{
if(l==r)//找到最底层
{
Tree[o].Max=Tree[o].Min=Tree[o].sum=y;//更新x节点值,变成y
return;
}
int mid=l+r>>1;//计算中间值
if(x<=mid)//如果x在左边 ,接着调用update
{
update(2*o,l,mid,x,y);
}
else//如果X在右边
{
update(2*o+1,mid+1,r,x,y);
}
push(o);//更新当前节点值
}
int main()
{
int n;
scanf("%d",&n);
buildtree(1,1,n);
update(1,1,n,3,10);
return 0;
}