/*H E A D*/
int from[maxn<<1],to[maxn<<1],nxt[maxn<<1],cost[maxn<<1],head[maxn],tot;
int size[maxn],fa[maxn],depth[maxn],top[maxn],son[maxn],dfn[maxn],pre[maxn],tot2;
void init(){
memset(head,-1,sizeof head);
memset(son,0,sizeof son);
memset(size,0,sizeof size);
memset(fa,0,sizeof fa);
tot=tot2=0;
}
void add(int u,int v,int w=0){
from[tot]=u;to[tot]=v;nxt[tot]=head[u];cost[tot]=w;
head[u]=tot++;
swap(u,v);
from[tot]=u;to[tot]=v;nxt[tot]=head[u];cost[tot]=w;
head[u]=tot++;
}
void dfs(int u,int p,int d){
size[u]=1;fa[u]=p;depth[u]=d;
erep(i,u){
int v=to[i];
if(v==p)continue;
dfs(v,u,d+1);
size[u]+=size[v];
if(size[v]>size[son[u]]){//update
son[u]=v;
}
}
}
void dfs2(int u,int tp){
pre[++tot2]=u;
dfn[u]=tot2;
top[u]=tp;
if(son[u]) dfs2(son[u],tp);//heavy --- ori top
erep(i,u){
int v=to[i];
if(v==son[u]||v==fa[u])continue;
dfs2(v,v);//light --- themselves
}
}
int val[maxn<<2];
struct ST{
int sum[maxn<<2],mx[maxn<<2],mn[maxn<<2];
bool rev[maxn<<2];
#define lc o<<1
#define rc o<<1|1
void pu(int o){
sum[o]=sum[lc]+sum[rc];
mx[o]=max(mx[lc],mx[rc]);
mn[o]=min(mn[lc],mn[rc]);
}
void pd(int o){
if(rev[o]){
sum[lc]=-sum[lc];mx[lc]=-mx[lc];mn[lc]=-mn[lc];
swap(mx[lc],mn[lc]);
sum[rc]=-sum[rc];mx[rc]=-mx[rc];mn[rc]=-mn[rc];
swap(mx[rc],mn[rc]);
rev[lc]^=1;
rev[rc]^=1;
rev[o]=0;
}
}
void build(int o,int l,int r){
rev[o]=0;mx[o]=-oo;mn[o]=oo;
if(l==r){
sum[o]=mx[o]=mn[o]=val[pre[l]];//note
return;
}
int m=l+r>>1;
build(lc,l,m);
build(rc,m+1,r);
pu(o);
}
void update(int o,int l,int r,int k,int v){
if(l==r){
sum[o]=mx[o]=mn[o]=v;
return;
}
pd(o);
int m=l+r>>1;
if(k<=m) update(lc,l,m,k,v);
else update(rc,m+1,r,k,v);
pu(o);
}
void flip(int o,int l,int r,int L,int R){
if(L<=l&&r<=R){
rev[o]^=1;
sum[o]=-sum[o];
mx[o]=-mx[o];
mn[o]=-mn[o];
swap(mx[o],mn[o]);
return;
}
pd(o);
int m=l+r>>1;
if(L<=m) flip(lc,l,m,L,R);
if(R>m) flip(rc,m+1,r,L,R);
pu(o);
}
int query(int o,int l,int r,int L,int R,int op){
if(L<=l&&r<=R){
switch(op){
case 1: return sum[o];
case 2: return mx[o];
case 3: return mn[o];
}
}
pd(o);
int m=l+r>>1;
int ans;
if(op==1){
ans=0;
if(L<=m) ans+=query(lc,l,m,L,R,op);
if(R>m) ans+=query(rc,m+1,r,L,R,op);
}
else if(op==2){
ans=-oo;
if(L<=m) ans=max(query(lc,l,m,L,R,op),ans);
if(R>m) ans=max(query(rc,m+1,r,L,R,op),ans);
}
else{
ans=oo;
if(L<=m) ans=min(query(lc,l,m,L,R,op),ans);
if(R>m) ans=min(query(rc,m+1,r,L,R,op),ans);
}
return ans;
}
}st;
char str[555];
void solve(){
int l,r,p1,p2,sum=0,mx=-oo,mn=oo;
l=read();r=read();l++;r++;
p1=top[l];p2=top[r];
while(p1!=p2){
if(depth[p1]<depth[p2]){
swap(p1,p2);
swap(l,r);
}
if(str[0]=='N') st.flip(1,1,tot2,dfn[p1],dfn[l]);
else if(str[0]=='S') sum+=st.query(1,1,tot2,dfn[p1],dfn[l],1);
else if(str[1]=='I') mn=min(mn,st.query(1,1,tot2,dfn[p1],dfn[l],3));
else if(str[1]=='A') mx=max(mx,st.query(1,1,tot2,dfn[p1],dfn[l],2));
l=fa[p1];
p1=top[l];
}
if(depth[l]>depth[r]) swap(l,r);
if(l==r){
// if(str[0]=='N') st.flip(1,1,tot2,dfn[l],dfn[r]); //!WrongAnswer
if(str[0]=='S') println(sum);
else if(str[1]=='I') println(mn);
else if(str[1]=='A') println(mx);
}
else{
l=son[l];
if(str[0]=='N'){
st.flip(1,1,tot2,dfn[l],dfn[r]);
}
else if(str[0]=='S'){
sum+=st.query(1,1,tot2,dfn[l],dfn[r],1);
println(sum);
}
else if(str[1]=='I'){
mn=min(mn,st.query(1,1,tot2,dfn[l],dfn[r],3));
println(mn);
}
else if(str[1]=='A'){
mx=max(mx,st.query(1,1,tot2,dfn[l],dfn[r],2));
println(mx);
}
}
}
int main(){
int n,u,v,w,x,y;
while(~iin(n)){
init();
rep(i,1,n-1){
u=read();v=read();w=read();
u++;v++;
add(u,v,w);
}
dfs(1,0,1);
dfs2(1,1);
rep(i,0,tot-1){
if(depth[from[i]]>depth[to[i]]){//
swap(from[i],to[i]);
}
val[to[i]]=cost[i];
}
st.build(1,1,tot2);
int m=read();
rep(i,1,m){
s0(str);
if(str[0]=='C'){
x=read();y=read();
st.update(1,1,tot2,dfn[to[(x-1)<<1]],y);//note bridgeNum->edgeNum
}
else solve();
}
}
return 0;
}

BZOJ - 2157 树链剖分+线段树的更多相关文章

  1. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  2. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  3. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  4. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  5. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  6. BZOJ 3589 动态树 (树链剖分+线段树)

    前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...

  7. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  8. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  9. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  10. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

随机推荐

  1. adb shell unauthorized问题

    出现unauthorized 一般插上usb后,手机会弹出一个要求你授权debugging的对话框,如果没有的话,就是rsa_key有问题: /adb_keys. User-installed key ...

  2. Vue 与Angular、React框架的对比

    首先,我们先了解什么是MVX框架模式? MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分 ...

  3. cakephp重写配置

    开启重新: (1)开启服务器的mod_rewrite模块 (2)注释掉app/ConfigScore.php中的 Configure::write('App.baseUrl', env('SCRIPT ...

  4. Vue.js路由组件

    1.如果在创建项目中,没有自动安装vue router,那就自行安装.cnpm install vue-router --save vue-router两种模式 hash模式和history模式. 默 ...

  5. Python3 常用爬虫库的安装

    Python3 常用爬虫库的安装 1 简介 Windows下安装Python3常用的爬虫库:requests.selenium.beautifulsoup4.pyquery.pymysql.pymon ...

  6. rest-framework-----视图

    一:基本视图 写一个出版社的增删改查的resful接口 路由: url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P& ...

  7. Linq学习<三> linq to entity

    之前一直用sql选择出数据放在一个集合中,然后再用Linq或者lambda去操作数据,今天学了Linq to entity 才知道原来linq产生是为了Entity.也就是EDM(实体数据模型) 关于 ...

  8. ipmitool批量添加新用户名和密码

    Intelligent Platform Management Interface 需求:已知BMC帐号id2为root管理员帐号,添加id5bmc帐号 工具:ipmitool version 1.8 ...

  9. c# 读取txt文档和写入文档的方法

    StreamReader sr = new StreamReader(path); //path是要读取的文件的完整路径 String str_read = sr.ReadToEnd(); //从开始 ...

  10. 转载:ResultMap和ResultType在使用中的区别

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...