题目叙述

同一棵树上有n个节点,编号分别吗1到n,每个节点都发出一个权值w。

我们将因为下面的形式来求你针对就棵树得有操作:

I. CHANGE u t : 把结点u的权值改呢t

II. QMAX u v: 询问起点u到点v的路上之节点的最充分权值

III. QSUM u v: 询问从点u到点v的路线上之节点的权值和

只顾:从点u到点v的途径上之节点包括u和v本身

人数的百年最后后悔什么[精]

输入输出格式

输入格式:

 

输入文件之率先表现一个整数n,表示节点的个数。

接下去n – 1履,每行2只整数a和b,表示节点a和节点b之间发生相同长边相连。

连通下一行n个整数,第i单整数wi表示节点i的权值。

紧接下去1履行,为一个整数q,表示操作的总和。

连片下q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u
v”的花样给有。

 

输出格式:

 

对每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示求输出的结果。

 

来一致小杂志就针对全国60夏以上之老人开展了这样同样次等问卷调查:你最后后悔什么?列有了10起人们在被好后悔的作业,供被调查者进行分选。

输入输出样例

输入样例#1:

4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4

出口样例#1:

4
1
2
2
10
6
5
6
5
16

    在连带人员对取消的实惠问卷展开统计之后,得出了这样的统计结果:

说明

对此100%底数码,保证1<=n<=30000,0<=q<=200000;中途操作着确保每个节点的权值w在-30000到30000以内。

 

赤裸的树链剖分。

专注有所的价都如取得最好充分还是最好小。

发生非常有点的负边权!

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int MAXN=1000001;
inline void read(int &n)
{
    char c='+';int x=0;bool flag=0;
    while(c<'0'||c>'9')
    {c=getchar();if(c=='-')flag=1;}
    while(c>='0'&&c<='9')
    {x=(x<<1)+(x<<3)+c-48,c=getchar();}
    flag==1?n=-x:n=x;
}
int n;
int a[MAXN];
int fa[MAXN];// 每一个节点的父亲节点
int deep[MAXN];// 每一个节点的深度
int top[MAXN];// 重链上的顶节点
int son[MAXN];// 每一个点的重儿子 
int size[MAXN];// 子节点的数量
int pos[MAXN];// 划分轻重链之后的编号
int tot;// 总结点的数量 
struct node
{
    int l,r,maxn,sum;
}tree[MAXN];
struct EDGE
{
    int u,v,nxt;
}edge[MAXN];
int head[MAXN];
int num=1;
//int nowmax=-1;
int nowsum=0;
void update(int k)
{
    tree[k].maxn=max(tree[ls].maxn,tree[rs].maxn);
    tree[k].sum=(tree[ls].sum+tree[rs].sum);
}
void add_edge(int x,int y)
{
    edge[num].u=x;
    edge[num].v=y;
    edge[num].nxt=head[x];
    head[x]=num++;
}
int dfs1(int now,int nowfa,int nowdeep)
{
    deep[now]=nowdeep;
    fa[now]=nowfa;
    size[now]=1;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(edge[i].v!=nowfa)
        {
            dfs1(edge[i].v,now,nowdeep+1);
            size[now]+=size[edge[i].v];
            if(son[now]==-1||size[edge[i].v]>size[son[now]])
                son[now]=edge[i].v;
        }
    }
}
void dfs2(int now,int nowid)
{
    tot++;
    pos[now]=tot;//更改当前节点的编号
    top[now]=nowid;
    if(!son[now])// 没有重儿子
        return ;
    dfs2(son[now],nowid);// 在一条重链上
    for(int i=head[now];i!=-1;i=edge[i].nxt)
        if(deep[edge[i].v]>deep[edge[i].u]&&edge[i].v!=son[edge[i].u])
            dfs2(edge[i].v,edge[i].v);//自己和自己一条重链    
    return ; 
}
void build_tree(int k,int ll,int rr)
{
    tree[k].l=ll;tree[k].r=rr;
    if(tree[k].l==tree[k].r)
    {
        tree[k].maxn=tree[k].sum=0;
        return ;
    }
    int mid=(ll+rr)>>1;
    build_tree(ls,ll,mid);
    build_tree(rs,mid+1,rr);
    update(k);
}
void insert(int k,int pos,int val)
{
    if(tree[k].l==tree[k].r)
    {
        tree[k].maxn=tree[k].sum=val;
        return ;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(pos<=mid)
        insert(ls,pos,val);
    if(pos>mid)
        insert(rs,pos,val);
    update(k);

}
int querymax(int k,int ll,int rr)
{
    if(ll<=tree[k].l&&tree[k].r<=rr)
        return tree[k].maxn;
    int mid=(tree[k].l+tree[k].r)>>1,nowmax=-1;
    if(ll<=mid)
        nowmax=max(nowmax,querymax(ls,ll,rr));
    if(rr>mid)
        nowmax=max(nowmax,querymax(rs,ll,rr));
    return nowmax;
}
int askmax(int u,int v)
{

    int ans=-0x7ffff;
    while(top[u]!=top[v])//不在一条重链上
    {
        if(deep[top[u]]<deep[top[v]])
            swap(u,v);
        ans=max(ans,querymax(1,pos[top[u]],pos[u]));    
        u=fa[top[u]];
    }
    if(pos[u]>pos[v])
        swap(u,v);
    ans=max(ans,querymax(1,pos[u],pos[v]));
    return ans;
}
int querysum(int k,int ll,int rr)
{
    if(ll<=tree[k].l&&tree[k].r<=rr)
        return tree[k].sum;
    int mid=(tree[k].l+tree[k].r)>>1,nowsum=0;
    if(ll<=mid)
        nowsum+=querysum(ls,ll,rr);
    if(rr>mid)
        nowsum+=querysum(rs,ll,rr);
    return nowsum;
}
int asksum(int u,int v)
{
    int ans=0;
    while(top[u]!=top[v])
    {
        if(deep[top[u]]<deep[top[v]])
            swap(u,v);
        ans+=querysum(1,pos[top[u]],pos[u]);
        u=fa[top[u]];
    }
    if(pos[u]>pos[v])
        swap(u,v);
    ans+=querysum(1,pos[u],pos[v]);
    return ans;
}
int main()
{
    ///freopen("bzoj_1036.in","r",stdin);
    //freopen("bzoj_1036.out","w",stdout);
    read(n);
    memset(head,-1,sizeof(head));
    //memset(son,-1,sizeof(son));
    for(int i=1;i<=n-1;i++)
    {
        int x,y;
        read(x);read(y);
        add_edge(x,y);
        add_edge(y,x);
    }
    for(int i=1;i<=n;i++)
        read(a[i]);
    dfs1(1,0,0);
    dfs2(1,1);
    build_tree(1,1,n);
    for(int i=1;i<=n;i++)
        insert(1,pos[i],a[i]);
    int q;
    read(q);
    for(int i=1;i<=q;i++)
    {
        string s;
        cin>>s;
        if(s[1]=='H')// 修改 
        {
            int p,v;
            read(p);read(v);
            a[p]=v;
            insert(1,pos[p],v);
        }
        else if(s[1]=='M')// 最大值 
        {
            int l,r;
            read(l);read(r);
            printf("%d\n",askmax(l,r));
        }
        else//求和 
        {
            int l,r;
            read(l);read(r);
            printf("%d\n",asksum(l,r));
        }
    }
    return 0;
}

  

 

http://four-corner.appspot.com/

 

    第一称:75%底口后悔年轻时极力不够,导致同行管成。 

  
 所谓丢壮不努力,老大徒伤悲,青春之大好时光总是流逝得那么尽快。而以青春岁月里,又常遇到那么多的吸引还是陷阱,当您突然清醒时,也许华发早生,才发现自己竟然一从业管成。

  
 多数人数还按着一样种从众的生活态度,别人上他吧修,别人干活外啊工作,别人打他为玩,自然的,别人拿走什么,他也无容许取得更多。要想赢得他人得无顶之东西,就需要交别人休情愿交的代价,尤其是当您年轻的早晚。所以,趁在公还有时间、有生机、有体力去全力的时光,赶快制定一个切实的计划吧,然后开始百折不挠地按照这个计划去一步步有助于,你终究会获得成功。

 

    第二名为:70%的食指后悔以青春的时节择错了业。

  
 三单大学生为同时分配至某活动办事,一年后,其中一个出于不甘心整天看主办的声色过日子要跳槽到其他一样寒店去矣,另外两个没有触动,依旧安稳地了在朝九晚五的光景。又同样年后,另外一个生决定辞去下海,剩下那个依然没触动,看正在温馨之点滴个同学在厂和市场里努力,他竟然得意于自己之落实生活。

  
 若干年后,三总人口欢聚一堂,到号去的那位同学早巳经成平等贱厂的厂长,下海的那位成了千万富翁,而留于机关的那位却照旧在主任的呵斥声中泡着自己屈指可数的“大好时光”。

  
 许多口在选择工作时考虑的首先元素即是稳定的低收入和落实舒适的生,而非极端情愿失去给那些有挑战性的机遇。没有了压力,自然就是差了动力,没有了动力,也尽管挂没了潜力。

 

    第三称呼:62%底人数后悔对子女教育不当。

  
 孩子是祥和生命之后续、希望之接轨,许多丁以子女可倾尽所有,并经一切伤痛和委屈。但望子成龙、盼女成凤可能只是大人单方面的绝妙愿望,对于男女而言,他们或只是怀念做一个简快乐的凡人。于是,许多老人家以了挟持、监督还棍棒等办法来逼子女本自己规划的线前行。可及最终,多数上下却只得在面对现实时感到失望,只有最少数所谓的“成功者”例外,但他俩也为当慨叹孩子这些年了得最为辛苦,丝毫不曾享受到小儿、少年应有之欢乐与太阳。

 

    第四名叫:57%底人后悔没有好珍惜好的伴儿。 

  
 醉过方知酒浓,爱过方知情重。感情方面的业务,永远是兼备时未亮尊重,失去后才晓得珍贵。人类世世代代发明不有底星星种植药品,一凡是纵情水,二凡后悔药。年轻的时段不错过强调、体谅和清楚,待到年老时,后悔都来不及。

 

    第五叫做:49%的人后悔没有善待自己的身体。 

  
 “身体是变革的本”,这句话永远都非会见过时,许多丁当60东前用身体失去换取一切,在60春秋以后又用所有去换取身体的健康。世界上从不呀事物比自己之常规更要,没有一个吓的身体,纵起绝对下产而哪?

 http://anforen.5d6d.com

    
我们因而羡慕年轻,是为年轻的时节可以随时后悔、随时改进,而而步入老年,许多政工就是无法改变了。所以,趁在青春,就应当努力地上学、加倍地喜欢,不要吃祥和及年老体衰的上还夺叹息万事成蹉跎。