#include <bits/stdc++.h>
using namespace std;
map<pair<long long, long long>, long long> cost;
void update(long long v, long long u, long long w) {
  long long lenv = 0, lenu = 0;
  long long h = v;
  while (h) h >>= 1, lenv++;
  h = u;
  while (h) h >>= 1, lenu++;
  while (lenv > lenu) {
    cost[{v >> 1, v}] += w;
    v >>= 1;
    lenv--;
  }
  while (lenv < lenu) {
    cost[{u >> 1, u}] += w;
    u >>= 1;
    lenu--;
  }
  while (u != v) {
    cost[{u >> 1, u}] += w, cost[{v >> 1, v}] += w;
    u >>= 1, v >>= 1;
  }
}
long long get(long long u, long long v) {
  long long ret = 0;
  long long lenv = 0, lenu = 0;
  long long h = v;
  while (h) h >>= 1, lenv++;
  h = u;
  while (h) h >>= 1, lenu++;
  while (lenv > lenu) {
    ret += cost[{v >> 1, v}];
    v >>= 1;
    lenv--;
  }
  while (lenv < lenu) {
    ret += cost[{u >> 1, u}];
    u >>= 1;
    lenu--;
  }
  while (u != v) {
    ret += cost[{u >> 1, u}] + cost[{v >> 1, v}];
    u >>= 1, v >>= 1;
  }
  return ret;
}
int main() {
  int q;
  cin >> q;
  for (int it = 0; it < q; it++) {
    int t;
    cin >> t;
    if (t == 1) {
      long long v, u, w;
      cin >> v >> u >> w;
      update(v, u, w);
    } else {
      long long v, u;
      cin >> v >> u;
      cout << get(v, u) << '\n';
    }
  }
  return 0;
}
