//Accepted    7324 KB    203 ms
/*
    source:fzu2028
    time  :2015.5.29
    by    :songt
  */
/*题解:
树链剖分
单点更新,求路径和
  */
#include <cstdio>
#include <cstring>

;

int max(int a,int b)
{
    return a>b?a:b;
}

void swap(int &a,int &b)
{
    int t=a;
    a=b;
    b=t;
}

struct Edge
{
    int u,v;
    Edge(){}
    Edge(int u,int v):u(u),v(v){}
}
edge[*imax_n];
int head[imax_n];
*imax_n];
int tot;
void addEdge(int u,int v)
{
    edge[tot]=Edge(u,v);
    next[tot]=head[u];
    head[u]=tot++;
}
int fa[imax_n],deep[imax_n],num[imax_n],son[imax_n];
int p[imax_n],fp[imax_n],top[imax_n];
int pos;
void init()
{
    memset(head,-,sizeof(head));
    memset(next,-,sizeof(next));
    tot=;
    memset(son,-,sizeof(son));
    pos=;
}
void dfs1(int u,int pre,int depth)
{
    deep[u]=depth;
    fa[u]=pre;
    num[u]=;
    ;i=next[i])
    {
        int v=edge[i].v;
        if (v!=pre)
        {
            dfs1(v,u,depth+);
            num[u]+=num[v];
             || num[son[u]]<num[v])
                son[u]=v;
        }
    }
}

void dfs2(int u,int sp)
{
    p[u]=pos++;
    fp[p[u]]=u;
    top[u]=sp;
    ) return ;
    dfs2(son[u],sp);
    ;i=next[i])
    {
        int v=edge[i].v;
        if (v!=fa[u] && v!=son[u])
        {
            dfs2(v,v);
        }
    }
}
struct Tree
{
    int l,r;
    long long sum;
    int tmax;
}f[imax_n*];
void build(int t,int l,int r)
{
    f[t].l=l;
    f[t].r=r;
    f[t].sum=;
    f[t].tmax=;
    if (l==r)
    {
        return ;
    }
    ;
    build(*t,l,mid);
    build(*t+,mid+,r);
}
void update(int t,int k,int value)
{
    if (f[t].l==k && f[t].r==k)
    {
        f[t].sum=value;
        f[t].tmax=value;
        return ;
    }
    ;
    *t,k,value);
    *t+,k,value);
    f[t].sum=f[*t].sum+f[*t+].sum;
    f[t].tmax=max(f[*t].tmax,f[*t+].tmax);
}
long long query(int t,int l,int r,int &tmax)
{
    if (f[t].l==l && f[t].r==r)
    {
        tmax=f[t].tmax;
        return f[t].sum;
    }
    ;
    *t,l,r,tmax);
    else
    {
        *t+,l,r,tmax);
        else
        {
            int tmax1,tmax2;
            long long sum1,sum2;
            sum1=query(*t,l,mid,tmax1);
            sum2=query(*t+,mid+,r,tmax2);
            tmax=max(tmax1,tmax2);
            return sum1+sum2;
        }
    }
}

long long find(int u,int v,int tmax)
{
    int f1=top[u],f2=top[v];
    ;
    ;
    int t;
    while (f1!=f2)
    {
        if (deep[f1]<deep[f2])
        {
            swap(f1,f2);
            swap(u,v);
        }
        sum+=query(,p[f1],p[u],t);
        tmp=max(tmp,t);
        u=fa[f1];
        f1=top[u];
    }
    if (u==v) return sum;
    if (deep[u]>deep[v]) swap(u,v);
    sum+=query(,p[son[u]],p[v],t);
    tmp=max(tmp,t);
    tmax=tmp;
    return sum;
}

];
int n,m;

int main()
{
    )
    {
        init();
        ;i<n-;i++)
        {
            scanf(],&e[i][],&e[i][]);
            addEdge(e[i][],e[i][]);
            addEdge(e[i][],e[i][]);
        }
        dfs1(,,);
        dfs2(,);
        //printf("after dfs\n");
        build(,,pos-);
        //printf("after build\n");
        ;i<n-;i++)
        {
            ]]<deep[e[i][]])
                swap(e[i][],e[i][]);
            update(,p[e[i][]],e[i][]);
        }
        //printf("after insert\n");
        int kind;
        int u,v,c;
        int tmax;
        ;i<m;i++)
        {
            scanf("%d%d%d",&kind,&u,&v);
            )
            {
                update(,p[e[u-][]],v);
            }
            else
            {
                printf("%lld\n",find(u,v,tmax));
            }
        }
    }
    ;
}

fzu2028的更多相关文章

随机推荐

  1. PacBio三代全长转录组/Iso-Seq技术及案例分析

    参考:产品手册 PacBio三代全长转录组有什么优势? 近年来,随着高通量测序技术的发展,转录组测序已经成为研究基因表达调控的主要手段.但二代的转录本重构准确率很低,三代可以直接得到全长转录本,无需组 ...

  2. js函数前面写上分号的原因

    说个之前先说,网站上传一些文件,考虑到性能问题,会用一些压缩软件来压缩代码(grunt,glup,webpack,etc..),这时候就可能出现一个问题.看下面代码 (function a(){... ...

  3. javac 导入第三方jar包

    如果是导入一个包,只需要 javac -classpath xxx/xxx/xxx.jar xxx.java 即可 如果有多个包,windows下用分号隔开,Lunix下用冒号隔开即可.

  4. Oracle 乱码

    导入DMP之后 ..... 1.Oacle数据库表中数据乱码 请检查导出DMP的ORACLE数据库编码设置 修改ORACLE编码与原DMP导出编码一致 select userenv('language ...

  5. Oracle 11g default profile 默认启用密码过期180天 ORA-28001错误处理

    问题描述:客户反映客户端不能登录应用程序时不能连接.环境:AIX 5.3 + Oracle 11gR2解决:远程Telnet到数据库主机,sqlplus / as sysdba 连接后操作正常,表明数 ...

  6. HTML 表单和输入<form><input>

    HTML <form> 标签 定义和用法: <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. ...

  7. T4模板批量生成代码

    大家通过比对下,就应该知道怎么玩. T4代码 <#@ template debug="false" hostspecific="true" languag ...

  8. vue-新建项目出错情况分析

    1.状况一: 按照正常流程新建项目,最终运行npm run dev 的时候,就频频出错,最终找出问题原来在于部分依赖包丢失了,于是重新安装所需要的依赖包再运行项目便好了!

  9. Oracle连接数据库的封装类OracleDB

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...

  10. c++读书笔记, 零散点滴的收获

    1. 字节长度: short <= int <= long <= long long 2. wchar_t,最大扩展字符集合:char16_t.char32_t,unocide字符集 ...