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;
#define f first
#define s second
#define pb push_back
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define ll long long
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 tree
{
tree *l = NULL, *r = NULL;
int lv, rv;
int res = 0;
tree(int lv, int rv) : lv(lv), rv(rv) {}
void enlarge()
{
int m = (lv + rv) >> 1;
if (l == NULL)
l = new tree(lv, m);
if (r == NULL)
r = new tree(m, rv);
}
int get(int L, int R)
{
enlarge();
if (L <= lv and rv <= R)
{
return res;
}
if (rv <= L or R <= lv)
return 0;
assert(rv - lv > 0);
return gcd2(l->get(L, R), r->get(L, R));
}
void set(int pos, int val)
{
enlarge();
res = gcd2(res, val);
if (rv - lv == 1)
return;
assert(rv - lv > 0);
int m = (lv + rv) >> 1;
if (pos < m)
l->set(pos, val);
else
r->set(pos, val);
}
};
struct TREE
{
TREE *l = NULL, *r = NULL;
int lv, rv, maxY;
tree *res;
TREE(int lv, int rv, int maxY) : lv(lv), rv(rv), maxY(maxY) { res = new tree(0, maxY); }
void enlarge()
{
int m = (lv + rv) >> 1;
if (l == NULL)
l = new TREE(lv, m, maxY);
if (r == NULL)
r = new TREE(m, rv, maxY);
}
int get(int L, int R, int lx, int ly)
{
enlarge();
if (L <= lv and rv <= R)
{
return res->get(lx, ly);
}
if (rv <= L or R <= lv)
return 0;
return gcd2(l->get(L, R, lx, ly), r->get(L, R, lx, ly));
}
void set(int x, int y, int val)
{
enlarge();
res->set(y, val);
if (rv - lv == 1)
return;
int m = (lv + rv) >> 1;
if (x < m)
l->set(x, y, val);
else
r->set(x, y, val);
}
};
TREE help(0, 1e9 + 10, 1e9 + 10);
vector<vector<int>> els;
void init(int R, int C)
{
els.resize(R, vector<int>(C));
/* ... */
}
void update(int P, int Q, long long K)
{
/* ... */
els[P][Q] = K;
}
long long calculate(int P, int Q, int U, int V)
{
/* ... */
int L = min(P, U);
int R = max(P, U) + 1;
int l = min(Q, V);
int r = max(Q, V) + 1;
int res = 0;
for (int x = L; x < R; ++x)
for (int y = l; y < r; ++y)
res = gcd2(res, els[x][y]);
return res;
}
// /////////////////////
// #include <stdio.h>
// #include <stdlib.h>
// #include <assert.h>
// #include <vector>
// #include "game.h"
// #define MAX_SIZE 1000000000
// #define MAX_N 272000
// int main()
// {
// int R, C, N;
// int P, Q, U, V;
// long long K;
// int i, type;
// assert(scanf("%d", &R) == 1);
// assert(scanf("%d", &C) == 1);
// assert(scanf("%d", &N) == 1);
// init(R, C);
// std::vector<long long> answers;
// for (i = 0; i < N; i++)
// {
// assert(scanf("%d", &type) == 1);
// if (type == 1)
// {
// assert(scanf("%d%d%lld", &P, &Q, &K) == 3);
// update(P, Q, K);
// }
// else if (type == 2)
// {
// assert(scanf("%d%d%d%d", &P, &Q, &U, &V) == 4);
// answers.push_back(calculate(P, Q, U, V));
// }
// }
// for (auto answer : answers)
// {
// printf("%lld\n", answer);
// }
// return 0;
// }
# | 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... |