#include <bits/stdc++.h>
using namespace std;
long long int n;
map<pair<long long int, long long int>, long long int> val;
long long int get_lca(long long int x, long long int y) {
  vector<long long int> a, b;
  a.clear();
  b.clear();
  while (x > 0) {
    a.push_back(x);
    x >>= 1;
  }
  while (y > 0) {
    b.push_back(y);
    y >>= 1;
  }
  reverse(a.begin(), a.end());
  reverse(b.begin(), b.end());
  long long int j = 0;
  for (j = 0; j < a.size() && j < b.size(); j++) {
    if (a[j] != b[j]) break;
  }
  return a[j - 1];
}
void upd(long long int x, long long int l, long long int w) {
  long long int y = x % 2;
  x >>= 1;
  while (x > 0) {
    val[{x, y}] += w;
    y = x % 2;
    x >>= 1;
  }
  y = l % 2;
  l >>= 1;
  while (l > 0) {
    val[{l, y}] -= w;
    y = l % 2;
    l >>= 1;
  }
}
long long int get(long long int x, long long int l) {
  long long int an = 0;
  long long int y = x % 2;
  x >>= 1;
  while (x > 0 && x >= l) {
    an += val[{x, y}];
    y = x % 2;
    x >>= 1;
  }
  return an;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    long long int t, u, v, w;
    cin >> t >> u >> v;
    if (t == 1) {
      cin >> w;
      long long int l = get_lca(u, v);
      upd(u, l, w);
      upd(v, l, w);
    } else {
      long long int l = get_lca(u, v);
      long long int an = get(u, l) + get(v, l);
      cout << an << '\n';
    }
  }
  return 0;
}
