Submission #1190992

#TimeUsernameProblemLanguageResultExecution timeMemory
1190992tyellowGame (IOI13_game)C++17
63 / 100
1090 ms278748 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define ff first #define ss second #define SZ(a) ((int)a.size()) #define pb push_back #define ALL(v) v.begin(), v.end() int n, m; struct SegNode1D { ll val = 0; SegNode1D *lp = nullptr, *rp = nullptr; }; struct SegmentTree1D { SegNode1D *node; void modify(int l, int r, SegNode1D *&p, int q, ll val) { if (p == nullptr) p = new SegNode1D; if (l == r) { p->val = val; return; } int mid = l + r >> 1; if (q <= mid) modify(l, mid, p->lp, q, val); else modify(mid + 1, r, p->rp, q, val); p->val = gcd(p->lp ? p->lp->val : 0, p->rp ? p->rp->val : 0); } void modify(int q, ll val) { modify(1, m, node, q, val); } ll query(int l, int r, SegNode1D *&p, int ql, int qr) { if (!p || ql > r || qr < l) return 0; if (ql <= l && r <= qr) return p->val; int mid = l + r >> 1; return gcd(p->lp ? query(l, mid, p->lp, ql, qr) : 0, p->rp ? query(mid + 1, r, p->rp, ql, qr) : 0); } ll query(int ql, int qr) { return query(1, m, node, ql, qr); } }; struct SegNode2D { SegmentTree1D val; SegNode2D *lp = nullptr, *rp = nullptr; }; struct SegmentTree2D { SegNode2D *node; void modify(int l, int r, SegNode2D *&p, int x, int y, ll val) { if (p == nullptr) p = new SegNode2D; if (l == r) { p->val.modify(y, val); return; } int mid = l + r >> 1; if (x <= mid) modify(l, mid, p->lp, x, y, val); else modify(mid + 1, r, p->rp, x, y, val); p->val.modify(y, gcd(p->lp ? p->lp->val.query(y, y) : 0, p->rp ? p->rp->val.query(y, y) : 0)); } void modify(int x, int y, ll val) { modify(1, n, node, x, y, val); } ll query(int l, int r, SegNode2D *&p, int U, int D, int L, int R) { if (!p || U > r || D < l) return 0; if (U <= l && r <= D) return p->val.query(L, R); int mid = l + r >> 1; return gcd(p->lp ? query(l, mid, p->lp, U, D, L, R) : 0, p->rp ? query(mid + 1, r, p->rp, U, D, L, R) : 0); } ll query(int U, int D, int L, int R) { return query(1, n, node, U, L, D, R); } } tree; void init(int R, int C) { n = R, m = C; } void update(int P, int Q, ll K) { tree.modify(++P, ++Q, K); } ll calculate(int P, int Q, int U, int V) { return tree.query(++P, ++Q, ++U, ++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...