#include <bits/stdc++.h>
using namespace std;
unordered_map<long long, long long> cost;
void add(long long u, int w) { cost[u] += w; }
long long query(long long u) { return cost.count(u) ? cost[u] : 0; }
int getdeep(long long x) {
  for (int i = 0; i < 63; i++) {
    if ((1ll << i) > x) return i;
  }
}
void work1(long long u, long long v, int w) {
  int d1 = getdeep(u), d2 = getdeep(v);
  while (u != v) {
    if (d1 < d2) swap(d1, d2), swap(u, v);
    assert(u != 1);
    add(u, w), u /= 2, d1--;
  }
}
long long work2(long long u, long long v) {
  int d1 = getdeep(u), d2 = getdeep(v);
  long long ans = 0;
  while (u != v) {
    if (d1 < d2) swap(d1, d2), swap(u, v);
    ans += query(u), u /= 2, d1--;
  }
  return ans;
}
int main() {
  int n;
  scanf("%d", &n);
  while (n--) {
    int op;
    long long u, v;
    int w;
    scanf("%d%I64d%I64d", &op, &u, &v);
    if (op == 1)
      scanf("%d", &w), work1(u, v, w);
    else
      printf("%I64d\n", work2(u, v));
  }
  return 0;
}
