이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "game.h"
using namespace std;
int const R = 1 << 30, C = 1 << 30;
// ^ really good programming language
struct NodeX
{
unsigned xChildren, yRoot;
};
struct NodeY
{
unsigned yChildren;
long long g;
};
NodeX *root;
unsigned allocNode(size_t s) { return (unsigned)((char *)calloc(1, s) - (char *)root); }
char *getYRoot(void *z) { return ((char *)root + *((unsigned *)z + 1)); }
char *getLeftChild(void *z) { return ((char *)root + *(unsigned *)z); }
char *getRightChild(void *z) { return ((char *)root + *(unsigned *)z + 16); }
void updateY(int Q, long long K, NodeY *z, int C, int D)
{
z->g = gcd(z->g, K);
if (C == D)
return;
if (!z->yChildren)
z->yChildren = allocNode(2 * sizeof(NodeY));
if (Q <= (C + D) / 2)
updateY(Q, K, (NodeY *)getLeftChild(z), C, (C + D) / 2);
else
updateY(Q, K, (NodeY *)getRightChild(z), (C + D) / 2 + 1, D);
}
void updateX(int P, int Q, long long K, NodeX *z, int A, int B, int C, int D)
{
if (!z->yRoot)
z->yRoot = allocNode(sizeof(NodeY));
updateY(Q, K, (NodeY *)getYRoot(z), C, D);
if (A == B)
return;
if (!z->xChildren)
z->xChildren = allocNode(2 * sizeof(NodeX));
if (P <= (A + B) / 2)
updateX(P, Q, K, (NodeX *)getLeftChild(z), A, (A + B) / 2, C, D);
else
updateX(P, Q, K, (NodeX *)getRightChild(z), (A + B) / 2 + 1, B, C, D);
}
long long calculateY(int Q, int V, NodeY *z, int C, int D)
{
if (D < Q || C > V)
return 0;
if (Q <= C && D <= V)
return z->g;
if (z->yChildren)
return gcd(calculateY(Q, V, (NodeY *)getLeftChild(z), C, (C + D) / 2),
calculateY(Q, V, (NodeY *)getRightChild(z), (C + D) / 2 + 1, D));
return 0;
}
long long calculateX(int P, int Q, int U, int V, NodeX *z, int A, int B, int C, int D)
{
if (B < P || A > U)
return 0;
if (P <= A && B <= U)
return z->yRoot ? calculateY(Q, V, (NodeY *)getYRoot(z), C, D) : 0;
if (z->xChildren)
return gcd(calculateX(P, Q, U, V, (NodeX *)getLeftChild(z), A, (A + B) / 2, C, D),
calculateX(P, Q, U, V, (NodeX *)getRightChild(z), (A + B) / 2 + 1, B, C, D));
return 0;
}
void init(int R, int C) { root = (NodeX *)malloc(sizeof *root); }
void update(int P, int Q, long long K)
{
updateX(P, Q, K, root, 0, R - 1, 0, C - 1);
}
long long calculate(int P, int Q, int U, int V)
{
return calculateX(P, Q, U, V, root, 0, R - 1, 0, C - 1);
}
# | 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... |