Submission #739658

#TimeUsernameProblemLanguageResultExecution timeMemory
739658SkywkGame (IOI13_game)C++11
63 / 100
1308 ms256000 KiB
#include "game.h" #include <algorithm> using namespace std; int N; struct STUpdate{ int i; long long x; STUpdate(int _i = -1, long long _x = -1) : i(_i), x(_x){}; }; struct STTUpdate{ int i; STUpdate u; STTUpdate(int _i = -1, int _j = -1, long long _x = -1) : i(_i){ u = {_j, _x}; } }; struct STQuery{ int l, r; STQuery(int _l = -1, int _r = -1) : l(_l), r(_r){}; }; struct STTQuery{ int l, r; STQuery q; STTQuery(int l1 = -1, int r1 = -1, int l2 = -1, int r2 = -1) : l(l1), r(r1){ q = {l2, r2}; } }; template<typename T, typename UT, typename QT> class SegmentTree{ private: void update(T *curr, int l, int r, const UT &u){ if(l == r){ curr->update(u); return; } int mit = (l + r) >> 1; if(curr->ls == NULL){ curr->create_child(); } if(u.i <= mit) update(curr->ls, l, mit, u); else update(curr->rs, mit+1, r, u); curr->merge(u); } long long query(T *curr, int l, int r, const QT &q){ if(l > q.r || r < q.l) return 0; if(q.l <= l && r <= q.r) return curr->query(q); int mit = (l + r) >> 1; long long res = 0; if(curr -> ls != NULL) res = __gcd(res, query(curr->ls, l, mit, q)); if(curr -> rs != NULL) res = __gcd(res, query(curr->rs, mit+1, r, q)); return res; } public: T root; void update(UT u){update(&root, 0, N-1, u);} long long query(QT q){return query(&root, 0, N-1, q);} }; struct STNode{ long long v; STNode *ls, *rs; STNode() : v(0), ls(NULL), rs(NULL){}; void create_child(){ ls = new STNode; rs = new STNode; } void update(const STUpdate &u){v = u.x;} long long query(const STQuery &q){return v;} void merge(const STUpdate &u){v = __gcd(ls->v, rs->v);} }; struct STTNode{ SegmentTree<STNode, STUpdate, STQuery> st; STTNode *ls, *rs; STTNode() : ls(NULL), rs(NULL){} void create_child(){ ls = new STTNode; rs = new STTNode; } void update(const STTUpdate &u){st.update(u.u);} long long query(const STTQuery &q){return st.query(q.q);} void merge(const STTUpdate &u){ long long q1 = ls->st.query({u.u.i, u.u.i}); long long q2 = rs->st.query({u.u.i, u.u.i}); st.update({u.u.i, __gcd(q1, q2)}); } }; SegmentTree<STTNode, STTUpdate, STTQuery> ST; void init(int R, int C){ N = max(R, C); } void update(int P, int Q, long long K) { ST.update({P, Q, K}); } long long calculate(int P, int Q, int U, int V) { return ST.query({P, U, Q, V}); }
#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...