제출 #650753

#제출 시각아이디문제언어결과실행 시간메모리
650753ymm게임 (IOI13_game)C++17
80 / 100
3590 ms256000 KiB
#include "game.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

struct node0 {
	ll x;
	node0 *l, *r;
} pool0[10000000];
struct node1 {
	node0 x;
	node1 *l, *r;
} pool1[10000000];
node0 *new_node0(){static int nxt=0; return &pool0[nxt++];}
node1 *new_node1(){static int nxt=0; return &pool1[nxt++];}

void up0(int p, ll x, node0 *t, int b=0, int e=1e9)
{
	if (e-b == 1) {
		t->x = x;
		return;
	}
	if (p < (b+e)/2) {
		if (!t->l) t->l = new_node0();
		up0(p, x, t->l, b, (b+e)/2);
	} else {
		if (!t->r) t->r = new_node0();
		up0(p, x, t->r, (b+e)/2, e);
	}
	t->x = __gcd(t->l? t->l->x: 0, t->r? t->r->x: 0);
}

void merge0(int p, node0 *l, node0 *r, node0 *t, int b=0, int e=1e9)
{
	t->x = __gcd(l? l->x: 0, r? r->x: 0);
	if (e-b == 1)
		return;
	if (p < (b+e)/2) {
		if (!t->l) t->l = new_node0();
		merge0(p, l? l->l: NULL, r? r->l: NULL, t->l, b, (b+e)/2);
	} else {
		if (!t->r) t->r = new_node0();
		merge0(p, l? l->r: NULL, r? r->r: NULL, t->r, (b+e)/2, e);
	}
}

ll get0(int l, int r, node0 *t, int b=0, int e=1e9)
{
	if (r <= b || e <= l || !t)
		return 0;
	if (l <= b && e <= r)
		return t->x;
	return __gcd(get0(l, r, t->l, b, (b+e)/2),
	             get0(l, r, t->r, (b+e)/2, e));
}

void up1(int p1, int p0, ll x, node1 *t, int b=0, int e=1e9)
{
	if (e-b == 1) {
		up0(p0, x, &t->x);
		return;
	}
	if (p1 < (b+e)/2) {
		if (!t->l) t->l = new_node1();
		up1(p1, p0, x, t->l, b, (b+e)/2);
	} else {
		if (!t->r) t->r = new_node1();
		up1(p1, p0, x, t->r, (b+e)/2, e);
	}
	merge0(p0, t->l? &t->l->x: NULL, t->r? &t->r->x: NULL, &t->x);
}

ll get1(int l1, int r1, int l0, int r0, node1 *t, int b=0, int e=1e9)
{
	if (r1 <= b || e <= l1 || !t)
		return 0;
	if (l1 <= b && e <= r1)
		return get0(l0, r0, &t->x);
	return __gcd(get1(l1, r1, l0, r0, t->l, b, (b+e)/2),
	             get1(l1, r1, l0, r0, t->r, (b+e)/2, e));
}

node1 *rt = new_node1();

void init(int R, int C)
{
}

void update(int P, int Q, long long K)
{
	up1(P, Q, K, rt);
}

long long calculate(int P, int Q, int U, int V)
{
	int l1 = min(P, U);
	int r1 = max(P, U) + 1;
	int l0 = min(Q, V);
	int r0 = max(Q, V) + 1;
	return get1(l1, r1, l0, r0, rt);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...