Submission #756385

#TimeUsernameProblemLanguageResultExecution timeMemory
756385alex_2008Game (IOI13_game)C++14
63 / 100
1391 ms256000 KiB
#include "game.h" #include <iostream> using namespace std; typedef long long ll; const ll W = 20000000; ll value[W]; int ls[W], rs[W]; int sz = 1; int n, m; ll qans; ll gcd(ll a, ll b) { while (a && b) { (a > b) ? a %= b : b %= a; } return a + b; } struct Nodey { Nodey* ls; Nodey* rs; int root; }; Nodey* Root; void queryX(int v, int C1, int C2, int vleft, int vright) { if (v == 0) v = ++sz; if (vright < C1 || vleft > C2) return; if (vleft >= C1 && vright <= C2) { qans = gcd(qans, value[v]); return; } if (ls[v] == 0) { qans = gcd(qans, value[v]); return; } int mid = (vleft + vright) / 2; queryX(ls[v], C1, C2, vleft, mid); queryX(rs[v], 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 == 0) { v->root = ++sz; } queryX(v->root, C1, C2, 1, m); return; } int mid = (vleft + vright) / 2; if (v->ls == nullptr) { Nodey* ls = new Nodey{ nullptr, nullptr, ++sz }; Nodey* rs = new Nodey{ nullptr, nullptr, ++sz }; 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(int v, int C, ll val, int vleft, int vright) { if (v == 0) v = ++sz; if (vleft > C || vright < C) return; if (vleft == vright) { value[v] = val; return; } if (ls[v] == 0) { int mid = (vleft + vright) / 2; ls[v] = ++sz; rs[v] = ++sz; value[ls[v]] = value[v]; value[rs[v]] = value[v]; Updatex(ls[v], C, val, vleft, mid); Updatex(rs[v], C, val, mid + 1, vright); value[v] = gcd(value[ls[v]], value[rs[v]]); return; } int mid = (vleft + vright) / 2; Updatex(ls[v], C, val, vleft, mid); Updatex(rs[v], C, val, mid + 1, vright); value[v] = gcd(value[ls[v]], value[rs[v]]); return; } void Updatey(Nodey* v, int R, int C, ll val, int vleft, int vright) { 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, ++sz }; Nodey* rs = new Nodey{ nullptr, nullptr, ++sz }; 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, 1 }; } 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...