类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了。注意sum和lastans是long long。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
typedef long long ll;
using namespace std; const int N=;
ll ans,sm[N];
int n,nd,tim,rt,op,x,y,m,cnt,a[N],tag[N];
int v[N],f[N],L[N],R[N],sz[N],c[N][],h[N],to[N],nxt[N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void dfs(int x,int fa){
L[x]=++tim; v[tim]=a[x];
For(i,x) if ((k=to[i])!=fa) dfs(k,x);
R[x]=++tim; v[tim]=a[x];
} void upd(int x){
sm[x]=sm[c[x][]]+sm[c[x][]]+v[x];
sz[x]=sz[c[x][]]+sz[c[x][]]+;
} void put(int x,int k){ v[x]+=k; sm[x]+=1ll*k*sz[x]; tag[x]+=k; } void push(int x){
if (!tag[x]) return;
if (c[x][]) put(c[x][],tag[x]);
if (c[x][]) put(c[x][],tag[x]);
tag[x]=;
} void pd(int x){ if (f[x]) pd(f[x]); push(x); } int build(int l,int r){
int mid=(l+r)>>,x=mid;
if (l<mid) c[x][]=build(l,mid-),f[c[x][]]=x;
if (mid<r) c[x][]=build(mid+,r),f[c[x][]]=x;
upd(x); return x;
} void rot(int &rt,int x){
int y=f[x],z=f[y],w=c[y][]==x;
if (y==rt) rt=x; else c[z][c[z][]==y]=x;
f[x]=z; f[y]=x; f[c[x][w^]]=y; c[y][w]=c[x][w^];
c[x][w^]=y; upd(y);
} void splay(int &rt,int x){
for (pd(x); x!=rt; rot(rt,x)){
int y=f[x],z=f[y];
if (y!=rt) (c[z][]==y)^(c[y][]==x) ? rot(rt,x) : rot(rt,y);
}
upd(x);
} int pre(int x){ splay(rt,x); for (x=c[x][]; c[x][]; x=c[x][]); return x; }
int lst(int x){ splay(rt,x); for (x=c[x][]; c[x][]; x=c[x][]); return x; } void Ins(int x,int y){
int k=lst(L[x]); splay(rt,L[x]); splay(c[rt][],k);
c[k][]=++nd; v[nd]=y; f[nd]=k; R[++n]=nd;
nd++; c[nd-][]=nd; v[nd]=y; f[nd]=nd-; L[n]=nd;
upd(nd); upd(nd-); upd(k); upd(rt);
} void Add(int x,int y){
int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r);
put(c[r][],y); upd(r); upd(rt);
} void Del(int x){
int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r);
c[r][]=f[c[r][]]=; upd(r); upd(rt);
} ll Que(int x){ int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r); return sm[c[r][]]; } int main(){
freopen("anudtq.in","r",stdin);
freopen("anudtq.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d",&a[i]);
rep(i,,n) scanf("%d%d",&x,&y),x++,y++,add(x,y),add(y,x);
tim=; dfs(,); rt=build(,tim+); nd=tim+; scanf("%d",&m);
rep(i,,m){
scanf("%d%d",&op,&x); x+=ans+;
if (op==) scanf("%d",&y),Ins(x,y);
if (op==) scanf("%d",&y),Add(x,y);
if (op==) Del(x);
if (op==) printf("%lld\n",ans=Que(x)/);
}
return ;
}

[CodeChef-ANUDTQ] Dynamic Trees and Queries的更多相关文章

  1. Codechef Dynamic Trees and Queries

    Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...

  2. CodeChef DGCD Dynamic GCD

    CodeChef题面 Time limit 210 ms Code length Limit //内存限制也不说一下,真是的-- 50000 B OS Linux Language limit C, ...

  3. 【CodeChef】Chef and Graph Queries

    Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...

  4. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  5. codechef Chef And Easy Xor Queries

    做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...

  6. Creating dynamic/configurable parameterized queries in Entity Framework

    https://dillieodigital.wordpress.com/2013/05/09/creating-dynamicconfigurable-parameterized-queries-i ...

  7. [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]

    题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...

  8. codechef FUN WITH TREES

    题目大意: 给一棵树root=1的树: 给一些操作:u  v 的路径所有节点的node + val: 最后m个询问:u 节点(包括u) sum%mod 是多少. LCA + RMQ: 我们每次mark ...

  9. BZOJ3514 / Codechef GERALD07 Chef and Graph Queries LCT、主席树

    传送门--BZOJ 传送门--VJ 考虑使用LCT维护时间最大生成树,那么对于第\(i\)条边,其加入时可能会删去一条边.记\(pre_i\)表示删去的边的编号,如果不存在则\(pre_i = 0\) ...

随机推荐

  1. Web前端鼠标悬停实现显示与隐藏效果

    css定义,偏移量,相对定位,绝对定位 显示与隐藏 二维码相对于微信图标定位 鼠标悬停微信图标上显示 鼠标离开微信图标时隐藏 什么是定位,就是定义网页标签在运行时显示的位置 css提供Position ...

  2. ranger整合kerberos

    一.生成主体 在kerberos服务器生成用于ranger的用户主体: # kadmin.local addprinc -randkey HTTP/manager1@HADOOP.COM addpri ...

  3. IE安全限制

    在安全级别下面设置置进行如下调整: A.ActiveX控件自动提示:启用 B.对标记为可安全执行脚本的ActiveX控件执行脚本:启用 C.对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本 ...

  4. 如何SpringBoot项目改为外置Tomcat启动

    正常情况下,我们开发 SpringBoot 项目,由于内置了Tomcat,所以项目可以直接启动,部署到服务器的时候,直接打成 jar 包,就可以运行了 (使用内置 Tomcat 的话,可以在 appl ...

  5. Android中Activity的启动模式(LaunchMode)和使用场景

    一.为什么需要启动模式在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些Ac ...

  6. 帆软 联合 创始人 数据可视化 中国 发展 FineReport FineBI

    丧心病狂!帆软公司的成立竟源于一个被初恋抛弃的程序员 - 大数据-炼数成金-Dataguru专业数据分析社区http://dataguru.cn/article-7500-1.html 帆软联合创始人 ...

  7. Python中的虚拟环境的使用

    1.安装virtualenv pip3 install virtualenv 2.创建目录 mkdir Myproject cd Myproject 3.创建独立运行环境-命名 virtualenv ...

  8. git 比较实用的命令

    git 删除已经add 过的文件 使用 git rm 命令即可,有两种选择, 使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删 ...

  9. [转]git登录账号密码错误remote: Incorrect username or password

    链接地址:https://baijiahao.baidu.com/s?id=1622020216177100162&wfr=spider&for=pc

  10. Centos7.3使用脚本自动静默安装oracle11.2.0.4数据库

    一直想着写一个脚本实现自动化安装oracle数据库.以下内容实验过几次了,可能还存在些小问题,如果在跑以下脚本中遇到问题,自己仔细排查即可 挣扎了好久,总算还是没实现,目前只能通过依次执行多个脚本来安 ...