题意:给一棵树,并给定各个点权的值,然后有3种操作:

I C1 C2 K: 把C1与C2的路径上的所有点权值加上K

D C1 C2 K:把C1与C2的路径上的所有点权值减去K

Q C:查询节点编号为C的权值

/*
要手动扩栈。
*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 100010
using namespace std;
int a[N],head[N],fa[N],son[N],dep[N],top[N],pos[N],sum[N*],tag[N*],n,m,p,sz;
struct node{
int to,pre;
};node e[N*];
void add(int i,int x,int y){
e[i].to=y;
e[i].pre=head[x];
head[x]=i;
}
void dfs1(int x){
son[x]=;
for(int i=head[x];i;i=e[i].pre){
int v=e[i].to;
if(fa[x]==v) continue;
fa[v]=x;dep[v]=dep[x]+;
dfs1(v);
son[x]+=son[v];
}
}
void dfs2(int x,int chain){
++sz;pos[x]=sz;top[x]=chain;int k=,maxn=;
for(int i=head[x];i;i=e[i].pre)
if(fa[x]!=e[i].to&&son[e[i].to]>maxn){
maxn=son[e[i].to];
k=e[i].to;
}
if(!k)return;
dfs2(k,chain);
for(int i=head[x];i;i=e[i].pre)
if(e[i].to!=fa[x]&&e[i].to!=k)
dfs2(e[i].to,e[i].to);
}
void pushup(int k){
sum[k]=sum[k*]+sum[k*+];
}
void pushdown(int k,int l,int r){
if(!tag[k]) return;
int mid=l+r>>;
tag[k*]+=tag[k];
tag[k*+]+=tag[k];
sum[k*]+=tag[k]*(l-mid+);
sum[k*+]+=tag[k]*(r-mid);
tag[k]=;
}
void change(int l,int r,int k,int x,int y,int v){
if(l>=x&&r<=y){
tag[k]+=v;
sum[k]+=(l-r+)*v;
return;
}
pushdown(k,l,r);
int mid=l+r>>;
if(x<=mid) change(l,mid,k*,x,y,v);
if(y>mid) change(mid+,r,k*+,x,y,v);
pushup(k);
}
int query(int l,int r,int k,int pos){
if(l==r)return sum[k];
pushdown(k,l,r);
int mid=l+r>>;
if(pos<=mid) return query(l,mid,k*,pos);
else return query(mid+,r,k*+,pos);
}
void xiugai(int x,int y,int v){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(,n,,pos[top[x]],pos[x],v);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
change(,n,,pos[x],pos[y],v);
}
void work(){
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
add(i*-,x,y);add(i*,y,x);
}
dfs1();dfs2(,);
for(int i=;i<=n;i++)change(,n,,pos[i],pos[i],a[i]);
char opt[];
for(int i=;i<=p;i++){
int x,y,v;
scanf("%s",opt);
if(opt[]=='I'){
scanf("%d%d%d",&x,&y,&v);
xiugai(x,y,v);
}
else if(opt[]=='D'){
scanf("%d%d%d",&x,&y,&v);
xiugai(x,y,-v);
}
else{
scanf("%d",&x);
printf("%d\n",query(,n,,pos[x]));
}
}
}
int main(){while(scanf("%d%d%d",&n,&m,&p)!=EOF){
memset(head,,sizeof(head));
memset(fa,,sizeof(fa));
memset(son,,sizeof(son));
memset(dep,,sizeof(dep));
memset(top,,sizeof(top));
memset(pos,,sizeof(pos));
memset(sum,,sizeof(sum));
memset(tag,,sizeof(tag));
sz=;
work();
}
return ;
}

Aragorn's Story(hdu3966)的更多相关文章

  1. html中id name class的区别(转)

    HTML 中 id与name 区别 一个name可以同时对应多个控件,比如checkbox和radio 而id必须是全文档中唯一的 id的用途 1) id是HTML元素的Identity,主要是在客户 ...

  2. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  3. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  4. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  5. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  6. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  7. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  8. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  9. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

随机推荐

  1. 如何找到SAP Cloud for Customer标准培训和认证方面的信息

    有一些朋友询问我如何在SAP官网上找到和SAP Cloud for Customer相关的标准培训信息,我这里把步骤写出来: 登录SAP官网https://training.sap.com 输入和Cl ...

  2. springboot上传linux文件无法浏览,提示404错误

    1.配置文件地址置换 @Componentclass WebConfigurer implements WebMvcConfigurer { @Autowired ConfigUtil bootdoC ...

  3. shell脚本,在指定目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件。

    [root@localhost wyb]# cat test10.sh #!/bin/bash #使用for循环在/test10目录下通过随机小写10个字母加固定字符串oldboy批量创建10个htm ...

  4. iOS dateformatter设置GMT格式时间--iOS开发系列---项目中成长的知识四

    今天在项目中开始接手客户端的签名这个模块,签名这个会在项目结束过后再单独写一下自己的心得! 今天讲讲在签名的过程中我们需要向服务器传送一个Date值,格式要求是格林威治时间,也就是GMT时间! 格式要 ...

  5. mongodb详细教程

    转自:https://www.cnblogs.com/liruihuan/tag/MongoDB/

  6. 简单的Redis数据迁移

    dump迁移 1.安装redis-dump工具 sudo apt-get install ruby rubygems ruby-devel -y gem sources --add http://ge ...

  7. python爬虫基础05-beautifulsoup

    HTML解析库BeautifulSoup4 本文链接:https://www.jianshu.com/p/e9255c446a77 BeautifulSoup 是一个可以从HTML或XML文件中提取数 ...

  8. django(django项目创建,数据库迁移)

    Django项目的创建与介绍 安装:pip3 install django==1.11 查看版本号:django-admin --version 新建项目: 1.切到目标目录 2.django-adm ...

  9. shell-note-1-基础篇

    1. Shell is a program written in C. It provides an interface for users to access to the service of o ...

  10. nrf52810学习笔记——三

    在开发nRF52系列的蓝牙方案的时候,会用到IDE.SDK.softdevice.nrfgoStudio等开发软件,这里做一个小小的总结. 首先,下载SDK,里面有适合keil4号iar7(iar8也 ...