#include #include 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; }