//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define FORI(it, X) for(__typeof((X).begin()) it = (X).begin(); it !=(X).end(); ++it) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define IN_FILE "a.in" #define OUT_FILE "a.out" #define MAX_LEVEL 15 #define INF 1000000000000000001 vector lastOnLevel, fibo, onLevel; int m; map val; long long kthOnLevel(long long k, int level) { return lastOnLevel[level - 1] + k; } int getLevel(LL node) { FOR(i, 1, MAX_LEVEL - 1) if (node > lastOnLevel[i] && node <= lastOnLevel[i + 1]) return i + 1; } long long getFather(LL node) { int level = getLevel(node); LL indexOnLevel = node - lastOnLevel[level - 1] - 1; LL fatherOnLevel = indexOnLevel / fibo[level] + 1; return kthOnLevel(fatherOnLevel, level - 1); } LL lca(LL node1, LL node2) { set anc1; while (node1 != 1) { anc1.insert(node1); node1 = getFather(node1); } anc1.insert(1); while (!anc1.count(node2)) { node2 = getFather(node2); } return node2; } int main() { //Read data //freopen(IN_FILE, "r", stdin); //freopen(OUT_FILE, "w", stdout); //Solve lastOnLevel.RS(MAX_LEVEL + 1); fibo.RS(MAX_LEVEL + 1); onLevel.RS(MAX_LEVEL + 1); lastOnLevel[1] = 1; onLevel[1] = 1; fibo[1] = 1; lastOnLevel[2] = 2; onLevel[2] = 1; fibo[2] = 1; FOR(i, 3, MAX_LEVEL) { fibo[i] = fibo[i - 1] + fibo[i - 2]; onLevel[i] = onLevel[i - 1] * fibo[i]; lastOnLevel[i] = lastOnLevel[i - 1] + fibo[i] * onLevel[i - 1]; } lastOnLevel[MAX_LEVEL] = INF; cin >> m; FOR(i, 1, m) { int op; cin >> op; if (op == 1) { LL x, y, z; cin >> x >> y >> z; LL l = lca(x, y); val[l] = val[l] + z; } if (op == 2) { LL x, y; cin >> x >> y; map ::iterator it1 = val.lower_bound(x); map ::iterator it2 = val.lower_bound(y); int count = 0; LL ans = -INF; for(map ::iterator it = it1; it != it2; ++it) { if(it->X >= x && it->X <= y) { ++count; ans = max(ans, it->Y); } } if (count == 0) { cout << "Comisia" << endl; } else { cout << ans << endl; } } } //Write data return 0; }