Submission #1175976

#TimeUsernameProblemLanguageResultExecution timeMemory
1175976elecballGame (IOI13_game)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int R, C, N; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } struct updcmd { int p, q; ll value; }; struct qrycmd { int p, q, u, v; }; struct Cnode { int left = -1, right = -1; ll value; }; struct Rnode { vector<Cnode> tree; int left = -1, right = -1; Rnode () { tree.emplace_back(); } void update(int node, int start, int end, int c, ll value) { if (start == end) { tree[node].value = value; return; } int mid = (start + end) / 2; if (c <= mid) { if (tree[node].left == -1) { tree[node].left = tree.size(); tree.emplace_back(); } update(tree[node].left, start, mid, c, value); } else { if (tree[node].right == -1) { tree[node].right = tree.size(); tree.emplace_back(); } update(tree[node].right, mid+1, end, c, value); } ll leftv = tree[node].left == -1 ? 0 : tree[tree[node].left].value, rightv = tree[node].right == -1 ? 0 : tree[tree[node].right].value; tree[node].value = gcd(leftv, rightv); } void ini_update(int c, ll value) { update(0, 1, C, c, value); } ll query(int node, int start, int end, int left, int right) { if (node == -1) return 0; if (left <= start && end <= right) return tree[node].value; int mid = (start + end) / 2; ll leftv = 0, rightv = 0; if (left <= mid) leftv = query(tree[node].left, start, mid, left, right); if (mid+1 <= right) rightv = query(tree[node].right, mid+1, end, left, right); return gcd(leftv, rightv); } ll ini_query(int left, int right) { return query(0, 1, C, left, right); } }; vector<Rnode> tree(1); ll query(int node, int start, int end, int rleft, int rright, int cleft, int cright) { if (node == -1) return 0; if (rleft <= start && end <= rright) return tree[node].ini_query(cleft, cright); int rmid = (start + end) / 2; ll leftv = 0, rightv = 0; if (rleft <= rmid) { leftv = query(tree[node].left, start, rmid, rleft, rright, cleft, cright); } if (rmid+1 <= rright) { rightv = query(tree[node].right, rmid+1, end, rleft, rright, cleft, cright); } return gcd(leftv, rightv); } ll ini_query(int rleft, int rright, int cleft, int cright) { return query(0, 1, R, rleft, rright, cleft, cright); } void update(int node, int start, int end, int r, int c, ll value) { if (start == end) { tree[node].ini_update(c, value); return; } int mid = (start + end) / 2; if (r <= mid) { if (tree[node].left == -1) { tree[node].left = tree.size(); tree.emplace_back(); } update(tree[node].left, start, mid, r, c, value); } else { if (tree[node].right == -1) { tree[node].right = tree.size(); tree.emplace_back(); } update(tree[node].right, mid+1, end, r, c, value); } ll leftv = tree[node].left == -1 ? 0 : tree[tree[node].left].ini_query(c, c), rightv = tree[node].right == -1 ? 0 : tree[tree[node].right].ini_query(c, c); tree[node].ini_update(c, gcd(leftv, rightv)); } void ini_update(int r, int c, ll value) { update(0, 1, R, r, c, value); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> R >> C >> N; vector<bool> cmdmods(N); // true = update, false = query vector<updcmd> updcmds; vector<qrycmd> qrycmds; vector<int> rlist, clist; for (int _ = 0; _ < N; _++) { int mod, p, q, u, v; ll k; cin >> mod; cmdmods[_] = mod == 1; if (mod == 1) { cin >> p >> q >> k; updcmds.push_back({p, q, k}); rlist.push_back(p); clist.push_back(q); } else { cin >> p >> q >> u >> v; qrycmds.push_back({p, q, u, v}); } } sort(rlist.begin(), rlist.end()); sort(clist.begin(), clist.end()); rlist.erase(unique(rlist.begin(), rlist.end()), rlist.end()); clist.erase(unique(clist.begin(), clist.end()), clist.end()); R = rlist.size(); C = clist.size(); unordered_map<int, int> rmap, cmap; // 1-index for (int i = 0; i < (int) rlist.size(); i++) rmap[rlist[i]] = i+1; for (int i = 0; i < (int) clist.size(); i++) cmap[clist[i]] = i+1; queue<updcmd> updq; queue<qrycmd> qryq; for (auto &uc: updcmds) { updq.push({rmap[uc.p], cmap[uc.q], uc.value}); } for (auto &qc: qrycmds) { auto itp = upper_bound(rlist.begin(), rlist.end(), qc.p), itq = upper_bound(clist.begin(), clist.end(), qc.q); int np = *itp == qc.p ? rmap[*(itp - 1)] : rmap[qc.p], nq = *itq == qc.q ? cmap[*(itq - 1)] : cmap[qc.q]; int nu = rmap[*lower_bound(rlist.begin(), rlist.end(), qc.u)], nv = cmap[*lower_bound(clist.begin(), clist.end(), qc.v)]; qryq.push({np, nq, nu, nv}); } for (auto mod: cmdmods) { if (mod) { updcmd c = updq.front(); updq.pop(); ini_update(c.p, c.q, c.value); } else { qrycmd c = qryq.front(); qryq.pop(); cout << ini_query(c.p, c.u, c.q, c.v) << "\n"; } } }

Compilation message (stderr)

/usr/bin/ld: /tmp/ccTuKME2.o: in function `main':
grader.c:(.text.startup+0x0): multiple definition of `main'; /tmp/cc2JISdv.o:game.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccTuKME2.o: in function `main':
grader.c:(.text.startup+0x6a): undefined reference to `init'
/usr/bin/ld: grader.c:(.text.startup+0xcc): undefined reference to `calculate'
/usr/bin/ld: grader.c:(.text.startup+0x136): undefined reference to `update'
collect2: error: ld returned 1 exit status