#include <iostream>
#include <algorithm>
using namespace std;

const long long INF = 1000000000000000000LL;
const int MAX_N = 100100;
const int MAX_LVL = 15;

long long fib[MAX_N];
long long lastOnLvl[MAX_N];
int cnt = 2;

long long getLevel(long long x) {
    for(int i = 0; i <= MAX_LVL; i++) {
        if(x <= lastOnLvl[i]) {
            return i;
        }
    }

    return MAX_LVL;
}

long long getFather(int x, int lv) {
    if(lv <= 1) {
        return 1;
    }
    x -= lastOnLvl[lv - 1] + 1;
    x = x / fib[lv];
    return lastOnLvl[lv - 2] + x + 1;
}


long long lca(long long x, long long y) {
    long long lx = getLevel(x);
    long long ly = getLevel(y);

    if(lx < ly) {
        swap(x, y);
        swap(lx, ly);
    }
    while(lx > ly) {
        x = getFather(x, lx);
        lx--;
    }
    while(x != y) {
        x = getFather(x, lx);
        lx--;
        y = getFather(y, ly);
        ly--;
    }

    return x;
}

class aint {
private:
    long long val;
    aint *f[2];

    long long getVal(aint *t) {
        if(t) {
            return t->val;
        }
        return -2 * INF;
    }

public:
    aint() {
        val = -2 * INF;
        f[0] = f[1] = nullptr;
    }

    void update(long long poz, long long x, long long st = 1, long long  dr = INF) {

        if(st == dr) {
              cout << st << ' ' << dr << ' ';
            if(val != -2 * INF) {
                val += x;
            }
            else {
                val = x;
            }
            cout << val << '\n';
            return;
        }

        long long mij = (st + dr) / 2;

        if(poz <= mij) {
            if(!f[0]) {
                f[0] = new aint();
            }
            f[0]->update(poz, x, st, mij);
        }
        else {
            if(!f[1]) {
                f[1] = new aint();
            }
            f[1]->update( poz, x, mij + 1, dr);
        }
        val = max(getVal(f[0]), getVal(f[1]));
    }

    long long query(long long x, long long y, long long st = 1, long long dr = INF) {
        if(st >= x && dr <= y) {
            return val;
        }

        long long mij = (st + dr) / 2;
        long long ans = -2 * INF;
        if(x <= mij) {
            if(f[0]) {
                ans = max(ans, f[0]->query(x, y, st, mij));
            }
        }
        if(y > mij) {
            if(f[1]) {
                ans = max(ans, f[1]->query(x, y, mij + 1, dr));
            }
        }
        return ans;
    }

};

aint *root = new aint();

int main() {
    fib[0] = 1;
    fib[1] = 1;
    while(fib[cnt - 2] + fib[cnt - 1] <= INF) {
        fib[cnt] = fib[cnt - 2] + fib[cnt - 1];
        cnt++;
    }

    lastOnLvl[0] = 1;
    lastOnLvl[1] = 2;
    for(int i = 2; ; i++) {
        if((lastOnLvl[i - 1] - lastOnLvl[i - 2])  > (INF - lastOnLvl[i - 1]) / fib[i]) {
            break;
        }
        else {
            lastOnLvl[i] = lastOnLvl[i - 1] + (lastOnLvl[i - 1] - lastOnLvl[i - 2]) * fib[i];
        }
    }

    int m;
    cin >> m;
    for(int i = 1; i <= m; i++) {
        int t;
        cin >> t;
        if(t == 1) {
            long long x, y, z;
            cin >> x >> y >> z;
            root->update(lca(x, y), z);
        }
        else {
            long long x, y;
            cin >> x >> y;
            long long ans = root->query(x, y);
            if(ans == -2 * INF) {
                cout << "Comisia\n";
            }
            else {
                cout << ans << '\n';
            }
        }
    }

    return 0;
}