Submission #756357

#TimeUsernameProblemLanguageResultExecution timeMemory
756357alex_2008Game (IOI13_game)C++14
63 / 100
1268 ms256000 KiB
#include "game.h" #include <iostream> using namespace std; typedef long long ll; int n, m; ll qans; ll gcd(ll a, ll b) { while (a && b) { (a > b) ? a %= b : b %= a; } return a + b; } struct Nodex { Nodex* ls; Nodex* rs; ll val; }; struct Nodey { Nodey* ls; Nodey* rs; Nodex* root; }; Nodey* Root; void queryX(Nodex* v, int C1, int C2, int vleft, int vright) { if (vright < C1 || vleft > C2) return; if (vleft >= C1 && vright <= C2) { qans = gcd(qans, v->val); return; } if (v->ls == nullptr) { qans = gcd(qans, v->val); return; } int mid = (vleft + vright) / 2; queryX(v->ls, C1, C2, vleft, mid); queryX(v->rs, C1, C2, mid + 1, vright); } void queryY(Nodey* v, int R1, int C1, int R2, int C2, int vleft, int vright) { if (vleft > R2 || vright < R1) { return; } if (vleft >= R1 && vright <= R2) { if (v->root == nullptr) { Nodex* rt = new Nodex{ nullptr, nullptr, 0 }; v->root = rt; } queryX(v->root, C1, C2, 1, m); return; } int mid = (vleft + vright) / 2; if (v->ls == nullptr) { Nodey* ls = new Nodey{ nullptr, nullptr, nullptr }; Nodey* rs = new Nodey{ nullptr, nullptr, nullptr }; v->ls = ls; v->rs = rs; } queryY(v->ls, R1, C1, R2, C2, vleft, mid); queryY(v->rs, R1, C1, R2, C2, mid + 1, vright); } void Updatex(Nodex* v, int C, ll val, int vleft, int vright) { if (vleft > C || vright < C) return; if (vleft == vright) { v->val = val; return; } if (v->ls == nullptr) { int mid = (vleft + vright) / 2; Nodex* ls = new Nodex{ nullptr, nullptr, v->val }; Nodex* rs = new Nodex{ nullptr, nullptr, v->val }; Updatex(ls, C, val, vleft, mid); Updatex(rs, C, val, mid + 1, vright); v->val = gcd(ls->val, rs->val); v->ls = ls; v->rs = rs; return; } int mid = (vleft + vright) / 2; Updatex(v->ls, C, val, vleft, mid); Updatex(v->rs, C, val, mid + 1, vright); v->val = gcd(v->ls->val, v->rs->val); return; } void Updatey(Nodey* v, int R, int C, ll val, int vleft, int vright) { if (v->root == nullptr) { v->root = new Nodex{ nullptr, nullptr, 0 }; } if (vleft > R || vright < R) return; if (vleft == vright) { Updatex(v->root, C, val, 1, m); return; } int mid = (vleft + vright) / 2; if (v->ls == nullptr) { Nodey* ls = new Nodey{ nullptr, nullptr, nullptr }; Nodey* rs = new Nodey{ nullptr, nullptr, nullptr }; v->ls = ls; v->rs = rs; } Updatey(v->ls, R, C, val, vleft, mid); Updatey(v->rs, R, C, val, mid + 1, vright); qans = 0; queryX(v->ls->root, C, C, 1, m); queryX(v->rs->root, C, C, 1, m); Updatex(v->root, C, qans, 1, m); } void init(int R, int C) { n = R; m = C; Root = new Nodey{ nullptr, nullptr, nullptr }; } void update(int R, int Q, long long K) { Updatey(Root, R + 1, Q + 1, K, 1, n); } long long calculate(int P, int Q, int U, int V) { qans = 0; queryY(Root, P + 1, Q + 1, U + 1, V + 1, 1, n); return qans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...