codeforces基礎問題——#362(div 2)C
3236 ワード
#362(Div 2) C
1 <= u, v <= 1018, w <= 109
: , 1 , i i * 2, i * 2 + 1,
q(1 <= q <= 1000) :
1. u v w;
2. u v ;
1 <= u, v <= 1018, w <= 109
C , , , map, LCA 。
#include
#include
using namespace std;
typedef long long LL;
int log(LL x)
{
int l = 0;
while(x) x >>= 1, l ++;
return l;
}
map m;
int main()
{
int q, ty, c;
LL a, b;
scanf("%d", &q);
for (int i = 1; i <= q; i ++) {
scanf("%d %I64d %I64d", &ty, &a, &b);
if (ty == 1) scanf("%d", &c);
int l1 = log(a), l2 = log(b);
LL sum = 0;
while(l1 > l2){
if (ty == 1) m[a] += c;
else sum += m[a];
a = a / 2, l1 --;
}
while(l1 < l2){
if (ty == 1) m[b] += c;
else sum += m[b];
b = b / 2, l2 --;
}
while(a != b){
if (ty == 1) m[a] += c, m[b] += c;
else sum += m[a] + m[b];
a = a / 2, b = b / 2;
}
if (ty == 2) printf("%I64d
", sum);
}
return 0;
}