# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
119796 | nvmdava | 게임 (IOI13_game) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#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{
int x1, x2, y1, y2;
long long gcd = 0;
Node *t[2][2] = {{NULL}};
Node(int _x1, int _y1, int _x2, int _y2){
x1 = _x1;
y1 = _y1;
x2 = _x2;
y2 = _y2;
}
void create(){
if(t[0][0] != NULL) return;
int mx = (x1 + x2) >> 1;
int my = (y1 + y2) >> 1;
t[0][0] = new Node(x1, y1, mx, my);
t[1][0] = new Node(mx + 1, y1, x2, my);
t[0][1] = new Node(x1, my + 1, mx, y2);
t[1][1] = new Node(mx + 1, my + 1, x2, y2);
}
void update(int x, int y, long long val){
if(x1 == x2 && y1 == y2){
gcd = val;
return;
}
create();
int mx = (x1 + x2) >> 1;
int my = (y1 + y2) >> 1;
if(x <= mx && y <= my)
t[0][0] -> update(x, y, val);
if(x > mx && y <= my)
t[1][0] -> update(x, y, val);
if(x <= mx && y > my)
t[0][1] -> update(x, y, val);
if(x > mx && y > my)
t[1][1] -> update(x, y, val);
gcd = gcd2(gcd2(t[0][0] -> gcd, t[1][1] -> gcd), gcd2(t[0][1] -> gcd, t[1][0] -> gcd));
}
long long query(int qx1, int qy1, int qx2, int qy2){
cerr<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<'\n';
if(qx1 > x2 || qy1 > y2 || qy2 < y1 || qx2 < x1) return 0;
if(gcd == 0) return 0;
if(qx1 <= x1 && qx2 >= x2 && qy1 <= y1 && qy2 >= y2) return gcd;
return gcd2(gcd2(t[0][0] -> query(qx1, qy1, qx2, qy2), t[0][1] -> query(qx1, qy1, qx2, qy2)), gcd2(t[1][0] -> query(qx1, qy1, qx2, qy2), t[1][1] -> query(qx1, qy1, qx2, qy2)));
}
} *root;
void init(int R, int C) {
root = new Node(0, 0, 2047, 2047);
}
void update(int P, int Q, long long K) {
root -> update(P, Q, K);
}
long long calculate(int P, int Q, int U, int V){
return root -> query(P, Q, U, V);
}
#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;
int res;
scanf("%d", &R);
scanf("%d", &C);
scanf("%d", &N);
init(R, C);
for (i = 0; i < N; i++) {
scanf("%d", &type);
if (type == 1) {
scanf("%d%d%lld", &P, &Q, &K);
update(P, Q, K);
} else if (type == 2) {
scanf("%d%d%d%d", &P, &Q, &U, &V);
printf("%lld\n", calculate(P, Q, U, V));
}
}
return 0;
}