This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
long long gcd2(long long X, long long Y) {
long long tmp;
while (X != Y && Y != 0) {
tmp = X;
X = Y;
Y = tmp % Y;
}
return X;
}
struct Node {
long long val; int l, r;
};
class RangedSegmentTree {
public:
vector<Node> I; int size_a, size_b, AX, AY, BX, BY;
void init(int H, int W) {
I.push_back(Node{0LL, -1, -1});
size_a = 1; while(size_a < H) size_a *= 2;
size_b = 1; while(size_b < W) size_b *= 2;
}
void update_(int cx, int cy, long long t, int ax, int ay, int bx, int by, int u) {
//cout << "cx = " << cx << ", cy = " << cy << ", t = " << t << ", ax = " << ax << ", ay = " << ay << ", bx = " << bx << ", by = " << by << ", u = " << u << endl;
if (by - ay == 1) {
I[u].val = t;
return;
}
if (bx - ax != 1) {
if (cx < ((ax + bx) >> 1)) {
if (I[u].l == -1) { I[u].l = I.size(); I.push_back(Node{0LL, -1, -1}); }
update_(cx, cy, t, ax, ay, (ax + bx) >> 1, by, I[u].l);
}
else {
if (I[u].r == -1) { I[u].r = I.size(); I.push_back(Node{0LL, -1, -1}); }
update_(cx, cy, t, (ax + bx) >> 1, ay, bx, by, I[u].r);
}
}
else {
if (cy < ((ay + by) >> 1)) {
if (I[u].l == -1) { I[u].l = I.size(); I.push_back(Node{0LL, -1, -1}); }
update_(cx, cy, t, ax, ay, bx, (ay + by) >> 1, I[u].l);
}
else {
if (I[u].r == -1) { I[u].r = I.size(); I.push_back(Node{0LL, -1, -1}); }
update_(cx, cy, t, ax, (ay + by) >> 1, bx, by, I[u].r);
}
}
long long B1 = 0; if(I[u].l >= 0) B1 = I[I[u].l].val;
long long B2 = 0; if(I[u].r >= 0) B2 = I[I[u].r].val;
I[u].val = gcd2(B1, B2);
return;
}
void update(int cx, int cy, long long t) {
update_(cx, cy, t, 0, 0, size_a, size_b, 0);
}
long long query_(int lx, int ly, int rx, int ry, int u) {
if (AX <= lx && rx <= BX && AY <= ly && ry <= BY) return I[u].val;
if (rx <= AX || BX <= lx || ry <= AY || BY <= ly) return 0;
if (rx - lx != 1) {
long long P1 = 0; if (I[u].l >= 0) P1 = query_(lx, ly, (lx + rx) >> 1, ry, I[u].l);
long long P2 = 0; if (I[u].r >= 0) P2 = query_((lx + rx) >> 1, ly, rx, ry, I[u].r);
return gcd2(P1, P2);
}
else {
long long P1 = 0; if (I[u].l >= 0) P1 = query_(lx, ly, rx, (ly + ry) >> 1, I[u].l);
long long P2 = 0; if (I[u].r >= 0) P2 = query_(lx, (ly + ry) >> 1, rx, ry, I[u].r);
return gcd2(P1, P2);
}
}
long long query(int ax, int ay, int bx, int by) {
AX = ax; AY = ay; BX = bx; BY = by;
return query_(0, 0, size_a, size_b, 0);
}
};
RangedSegmentTree Z;
void init(int R, int C) {
Z.init(R, C);
}
void update(int P, int Q, long long K) {
Z.update(P, Q, K);
}
long long calculate(int P, int Q, int U, int V) {
return Z.query(P, Q, U + 1, V + 1);
}
Compilation message (stderr)
grader.c: In function 'int main()':
grader.c:18:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
int res;
^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |