题干:

巴尼住在NYC。NYC具有从1开始的正整数编号的无数个交叉点。在交叉点 i 和 2i 之间以及 i和 2i + 1 之间存在双向道路,对任意整数 i 都满足。在任意两点之间都有且只有一条最短路。

最初任何人都可以通过任何道路免费。 但是后来发生了 q 个事件。 有两种类型的事件:

1. 政府制定新规。 一个规则可以用三个整数表示 vu 和 w。经过这次操作,点 u 到点 v 路径上的所有点增加 w 元路费。

2. 巴尼从点 v 通过最短路移动到点 u

现巴尼想知道,他的每一次移动需要花多少钱

Input

第一行包含一个整数 q (1 ≤ q ≤ 1 000).

之后 q 行,每行包含一个事件。加路费的事件都被描述成 1 v u w ,代表将点 u 到点 v 路径上所有点路费增加 w 元。移动的事件都被描述成 2 v u,表示巴尼从点 v 走到点 u.

1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109。

Output

对于第二类的每个事件,打印Barney在此事件中通过的所有道路的通行费的总和,一行。 以相应事件的时间顺序打印答案。

Example

Input

7
1 3 4 30
1 4 1 2
1 3 6 8
2 4 3
1 6 1 40
2 3 7
2 2 4

Output

94
0
32

Note

In the example testcase:

Here are the intersections used:

  1. Intersections on the path are 3, 1, 2 and 4.
  2. Intersections on the path are 4, 2 and 1.
  3. Intersections on the path are only 3 and 6.
  4. Intersections on the path are 4, 2, 1 and 3. Passing fee of roads on the path are 32, 32 and 30 in order. So answer equals to 32 + 32 + 30 = 94.
  5. Intersections on the path are 6, 3 and 1.
  6. Intersections on the path are 3 and 7. Passing fee of the road between them is 0.
  7. Intersections on the path are 2 and 4. Passing fee of the road between them is 32 (increased by 30 in the first event and by 2 in the second).

解题报告:

注意到i,2i与 i,2i+1的搭配,考虑二叉树。因为最大的值是1e18,所以层数一定不会很多(最多也就60层吧?)所以对于更新和查询均可以暴力。用点权代表他和父节点的边权,一维map就可以解决。(二维map也可以,但是因为孩子节点的父节点是唯一的,所以孩子节点就可以当做这条边的特征元)

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
map<ll,ll> mp;
void add(ll u,ll v,ll w) {while(u!=v) {if(u>v) mp[u] += w,u /= 2;else mp[v] += w,v /= 2;}
}
ll sum(ll u,ll v) {ll res = 0;while(u!=v) {if(u>v) res += mp[u],u /= 2;else res += mp[v],v /= 2;}return res;
}
int main()
{int q,op;ll u,v,w;cin>>q;while(q--) {scanf("%d",&op);if(op == 1) {scanf("%lld%lld%lld",&u,&v,&w);add(u,v,w);}else {scanf("%lld%lld",&u,&v);printf("%lld\n",sum(u,v));}}return 0 ;
}

【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)相关推荐

  1. Codeforces 697C Lorenzo Von Matterhorn(严格二叉树的LCA) - xgtao -

    Lorenzo Von Matterhorn 给出一棵二叉树,节点i与2*i和2*i+1相连,i的范围是1~10^18,每一条边有一个权值w(0~10^9),给出q(1~1000)个操作,操作有两种, ...

  2. cf#362-C. Lorenzo Von Matterhorn

    http://codeforces.com/contest/697/problem/C 给你一个完全二叉树 两个操作 1: u,v,w 把u到v上的路都加w权值 2:u,v  查询u到v的权值和 uv ...

  3. 数据结构-树与二叉树-思维导图+小结

    数据结构-树与二叉树-思维导图 1 数据结构-第五章-树与二叉树-思维导图 2 思维导图-补充 3 小结 3.1 知识点小结 3.2 习题小结 1 数据结构-第五章-树与二叉树-思维导图   数据结构 ...

  4. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  5. codeforces 148 C. Terse princess(思维,构造)

    C. Terse princess(思维,构造) 题目链接:codeforces 148C 题意:     有个公主找王子,如果这个人比之前所有王子的财富都高,公主就会Oh,              ...

  6. CodeForces - 1498D Bananas in a Microwave(思维+dp)

    题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...

  7. CodeForces - 813E Army Creation(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti​ 为数字 ...

  8. CodeForces - 1030C Vasya and Golden Ticket(思维)

    题目链接:点击查看 题目大意:给定长度为n的字符串,字符串全部由0~9的数字组成,要求将字符串划分为连续的子字符串,要求每个子字符串的和都要相等,问给定字符串能否成功划分 题目分析:简单思维,因为划分 ...

  9. CodeForces - 1245A Good ol' Numbers Coloring (思维)

    Codeforces Round #597 (Div. 2 Consider the set of all nonnegative integers: 0,1,2,-. Given two integ ...

最新文章

  1. Windows 10 RedStone2值得期待的五大功能猜想
  2. css之px自动转rem—sublime 插件CSSREM
  3. MySql 中文乱码排查解决方案
  4. 【限时免费报名】MongoDB原厂和阿里专家喊你来训练营上课啦!
  5. java解析xml的几种方式
  6. Spring5参考指南:依赖注入
  7. (转)用JS实现表格中隔行显示不同颜色
  8. 坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模
  9. conda创建虚拟环境,拥有多个Anconda版本
  10. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  11. PHP正则匹配Html内容,并通过浏览器弹框下载Excel
  12. HTML和JavaScript学习笔记
  13. 雪球网基于沪深300的评论爬虫
  14. 卡牌游戏算法原理、代码
  15. 使用Telnet连接smtp服务器发送邮件
  16. 会编程的少年有多厉害?8岁女儿写代码哄程序员爸爸开心,网友直呼:破防了
  17. H5页面自适应各种手机端屏幕分辨率的大小
  18. 前端使用滑块滑动进行验证的思路
  19. 服务器绑定自己的域名-腾讯云
  20. 树莓linux pi密码,树莓派 忘记密码的解决方法

热门文章

  1. hdu4353 Finding Mine三角形内的点数
  2. 【小技巧】字符char与整型int的相互转换
  3. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第5篇]复杂性类NP是什么意思?
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第50篇]什么是BLS基于Weil对的签名方案?
  5. php http请求xml数据,使用php从HTTP POST请求中检索XML
  6. mysql分库一致性_分库分表带来的完整性和一致性问题
  7. mysql两个表查询修改_MySQL:查询、修改(二)
  8. 2021年河南高考成绩排名查询一分一段表,2018河南高考一分一段统计表,查排名必备!...
  9. AD16画线时如何切换90°、45°、任意角度画线模式
  10. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列