Submission #548445

#TimeUsernameProblemLanguageResultExecution timeMemory
548445lorenzoferrariGame (IOI13_game)C++17
0 / 100
527 ms23068 KiB
#include <bits/stdc++.h> #include "game.h" #pragma GCC optimize ("O3") using namespace std; using LL = long long; constexpr int LIM = 1e9 + 1; int R; int C; inline LL gcd2(LL a, LL b) { LL x; while (a != b && b != 0) { x = a; a = b; b = x % b; } return a; } struct st { // static vector<st> pool_st; static st * new_st(int a = 0, int b = C+5) { auto ret = new st; ret->a = a; ret->b = b; return ret; // pool_st.resize(pool_st.size() + 1); // pool_st.back().a = a; // pool_st.back().b = b; // return &pool_st.back(); } int a, b; st * l = nullptr; st * r = nullptr; LL g = 0; st() {} ~st() { if (l) delete l; if (r) delete r; } friend void update(st * const n, const int p, const LL k) { if (p < n->a || n->b <= p) return; if (n->b - n->a <= 1) { n->g = k; return; } // if (n) cerr << "st_update: " << "[" << n->a << " " << n->b << "), " << p << " " << k << " - g: " << n->g << endl; int m = (n->a+n->b) / 2; if (p < m) { if (!n->l) n->l = new_st(n->a, m); update(n->l, p, k); } else { if (!n->r) n->r = new_st(m, n->b); update(n->r, p, k); } n->g = gcd2(n->l ? n->l->g : 0, n->r ? n->r->g : 0); } friend LL query(const st * const n, const int l, const int r) { if (!n || r <= n->a || n->b <= l) return 0LL; if (l <= n->a && n->b <= r) return n->g; return gcd2(query(n->l, l, r), query(n->r, l, r)); } }; struct sst { static vector<sst> pool_sst; static sst * new_sst(int a = 0, int b = R+5) { auto ret = new sst; ret->a = a; ret->b = b; return ret; // pool_sst.resize(pool_sst.size() + 1); // pool_sst.back().a = a; // pool_sst.back().b = b; // return &pool_sst.back(); } int a, b; sst * l = nullptr; sst * r = nullptr; st * son = nullptr; sst() {} ~sst() { if (l) delete l; if (r) delete r; if (son) delete son; } friend void sst_update(sst * const n, const int p, const int q, const LL k) { // if (n) cerr << "sst_update: " << "[" << n->a << " " << n->b << "), " << p << " " << q << " " << k << endl; // if (!n) cerr << "nope\n"; if (p < n->a || n->b <= p) return; if (!n->son) n->son = st::new_st(); update(n->son, q, k); if (n->b - n->a <= 1) return; int m = (n->a+n->b) / 2; if (p < m) { if (!n->l) n->l = new_sst(n->a, m); sst_update(n->l, p, q, k); return; } else { if (!n->r) n->r = new_sst(m, n->b); sst_update(n->r, p, q, k); return; } } friend LL sst_query(const sst * const n, const int p, const int q, const int u, const int v) { // if (n) cerr << "sst_query: " << "[" << n->a << " " << n->b << "), " << p << " " << q << " " << u << " " << v << endl; // if (!n) cerr << "nope\n"; if (!n || u <= n->a || n->b <= p) return 0LL; if (p <= n->a && n->b <= u) return query(n->son, q, v); return gcd2(sst_query(n->l, p, q, u, v), sst_query(n->r, p, q, u, v)); } }; // st::pool_st = vector<st>; // sst::pool_sst = vector<sst>; sst * root; void cleanup() { delete root; } void init(int r, int c) { R = r+5; C = c+5; // root = sst::new_sst(0, r+5); root = sst::new_sst(); assert(atexit(cleanup) == 0); } void update(int p, int q, LL k) { sst_update(root, p, q, k); } long long calculate(int p, int q, int u, int v) { return sst_query(root, p, q, u+1, v+1); }
#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...