Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. There exists a bidirectional road between intersections i and 2i and another road between i and 2i + 1 for every positive integer i. You can clearly see that there exists a unique shortest path between any two intersections.

Initially anyone can pass any road for free. But since SlapsGiving is ahead of us, there will q consecutive events happen soon. There are two types of events:

1. Government makes a new rule. A rule can be denoted by integers vu and w. As the result of this action, the passing fee of all roads on the shortest path from u to v increases by w dollars.

2. Barney starts moving from some intersection v and goes to intersection u where there's a girl he wants to cuddle (using his fake name Lorenzo Von Matterhorn). He always uses the shortest path (visiting minimum number of intersections or roads) between two intersections.

Government needs your calculations. For each time Barney goes to cuddle a girl, you need to tell the government how much money he should pay (sum of passing fee of all roads he passes).

Input

The first line of input contains a single integer q (1 ≤ q ≤ 1 000).

The next q lines contain the information about the events in chronological order. Each event is described in form 1 v u w if it's an event when government makes a new rule about increasing the passing fee of all roads on the shortest path from u to v by w dollars, or in form 2 v u if it's an event when Barnie goes to cuddle from the intersection v to the intersection u.

1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109 states for every description line.

Output

For each event of second type print the sum of passing fee of all roads Barney passes in this event, in one line. Print the answers in chronological order of corresponding events.

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 to32 + 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).
题目大意:先给出q次操作,当输入1的时候,表示一棵完全二叉树的两个节点u、v之间最短路径的权值全部加上w,当输入2的时候,表示询问这棵树的u到v节点间最短路径的权值之和。
解题思路:其实没什么特别的。。。我一开始想的是 最近公共祖先+哈希+搜索,其实没那么麻烦,就map暴力搞就行0.0
代码:
#include <map>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;
map<LL, LL> m;
LL solve(LL u, LL v, LL w){vector<LL> vec;vec.clear();LL t = u, flag = 1;while(t){vec.push_back(t);t /= 2;}int len = vec.size();t = v;while(t){for(int i = 0; i < len; ++i){if(t == vec[i]) {flag = 0; break;}}if(!flag) break;t /= 2; }if(w == -1){LL ans = 0;while(u != t){ans += m[u];u /= 2;}while(v != t){ans += m[v];v /= 2;}return ans;}else{while(u != t){m[u] += w;u /= 2;}while(v != t){m[v] += w;v /= 2;}}return 1LL;
}
int main()
{// freopen("test.in", "r+", stdin);// freopen("test.out", "w+", stdout);m.clear();LL q, op, u, v, w;scanf("%I64d", &q);while(q--){scanf("%I64d", &op);if(op == 1){scanf("%I64d%I64d%I64d", &u, &v, &w);solve(u, v, w);}else{scanf("%I64d%I64d", &u, &v);LL ans = solve(u, v, -1);printf("%I64d\n", ans);}}return 0;
}

不过讲道理,,,我看我的代码写的实在是搓,看到一个毛子写的代码如下:

#include <iostream>
#include <map>using namespace std;map<long long, long long> mp;int main() {ios_base::sync_with_stdio(false);cin.tie(0);int q;cin >> q;for(int qq = 0; qq < q; qq++) {int t;cin >> t;if(t == 1) {long long v, u, w;cin >> v >> u >> w;while(v != u) {if(v < u)swap(v, u);mp[v] += w;v /= 2;}}else {long long v, u;cin >> v >> u;long long ans = 0;while(v != u) {if(v < u)swap(v, u);ans += mp[v];v /= 2;}cout << ans << '\n';}}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. 【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)

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

  3. 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 ...

  4. codeforces泛做

    codeforces div1的题目,一般是做B.C.D 有的A题觉得有价值也会做,死活不会的就跳了-- 364 B: Connecting Universities Problem: 一颗无根树上给 ...

  5. Cf 362div2 C [map暴力,思维能力]

    题目连接 http://codeforces.com/contest/697/problem/C Description Barney lives in NYC. NYC has infinite n ...

  6. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  7. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  8. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  9. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  10. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

最新文章

  1. jdbc与hibernate的优缺点比较
  2. python保留字的基本含义-python 33个保留字是什么意思
  3. 基于MATLAB的IIR滤波器设计与实现
  4. Centos 6.9 Kick Start 无人值守安装
  5. SAP系统权限管理及参数设置
  6. springboot整合sharding-jdbc
  7. Facebook 内部高效工作PPT
  8. CISCO 2811 路由器配置命令全集
  9. 办公室计算机知识考试试题,办公室人员电脑操作基本技能方面测试题--绝对经典...
  10. CorelDRAW2022下载附带序列号安装教程
  11. 【报名】榜单奖项+产业图谱+行业报告+线下论坛,2021年终金猿策划活动已开启...
  12. 爬虫ip在使用中被封了如何解决 ?
  13. Celery 分发任务
  14. WordPress 自动为文章添加标签内链、文章自动添加标签
  15. 2019第四届新媒体千人峰会广州站将于6月正式开幕!
  16. sony 播放器 android,试玩 | “重新拥抱Android系统”Sony NW-ZX505 便携播放器
  17. pyHook pyHook3 区别_英雄联盟手游和端游区别-lol手游手游和端游区别一览
  18. 练习_20220305
  19. 一键生成 PPT,斯坦福博士生自制PPT生成神器火了
  20. oracle应付创建会计科目,ORACLE创建会计科目出现的系统警告,求牛人指点迷津!该怎么处理...

热门文章

  1. Oracle 历史数据表迁移方案
  2. 社区论坛小程序开发制作(同城圈子小程序)
  3. win10如何查看服务器日志文件,系统日志在哪里?win10系统错误日志怎么查看
  4. 星际迷航的William Shatner发推文支持Vitalik Buterin
  5. ipad远程控制windows电脑
  6. ubuntu20.04安装并运行ORB_SLAM3(一路顺风版)
  7. Unity3D笔记第十五天——Unity2D技术
  8. 武汉市计算机类中专学校排名,武汉中职中专学校一览表 2021最新排名
  9. matlab异距分组直方图,如何绘制不等距分组的直方图?
  10. 云终端计算机进入bios,【惠普进bios按什么键】惠普进bios调u盘启动_惠普进入bios-系统城...