Submission #390253

#TimeUsernameProblemLanguageResultExecution timeMemory
390253rainboyGame (IOI13_game)C11
10 / 100
13101 ms6796 KiB
#include "game.h"

#define LG	30	/* LG = ceil(log2(10^9)) */
#define NU	22000
#define N	(NU * (LG + 1))

long long gcd(long long a, long long b) {
	return b == 0 ? a : gcd(b, a % b);
}

int r, c;
long long xx[1 + N]; int ul[1 + N], ur[1 + N], dl[1 + N], dr[1 + N], t_, _ = 1;

void init(int R, int C) {
	r = R, c = C;
}

int update_(int t, int il, int ir, int jl, int jr, int i, int j, long long x) {
	if (t == 0)
		t = _++;
	if (ir - il == 1 && jr - jl == 1)
		xx[t] = x;
	else {
		int im = (il + ir) / 2, jm = (jl + jr) / 2;

		if (i < im && j < jm)
			ul[t] = update_(ul[t], il, im, jl, jm, i, j, x);
		else if (i < im && j >= jm)
			ur[t] = update_(ur[t], il, im, jm, jr, i, j, x);
		else if (i >= im && j < jm)
			dl[t] = update_(dl[t], im, ir, jl, jm, i, j, x);
		else
			dr[t] = update_(dr[t], im, ir, jm, jr, i, j, x);
		xx[t] = gcd(gcd(gcd(xx[ul[t]], xx[ur[t]]), xx[dl[t]]), xx[dr[t]]);
	}
	return t;
}

long long ans;

void query_(int t, int il, int ir, int jl, int jr, int i1, int i2, int j1, int j2) {
	int im, jm;

	if (i2 <= il || ir <= i1 || j2 <= jl || jr <= j1)
		return;
	if (i1 <= il && ir <= i2 && j1 <= jl && jr <= j2) {
		ans = gcd(ans, xx[t]);
		return;
	}
	im = (il + ir) / 2, jm = (jl + jr) / 2;
	query_(ul[t], il, im, jl, jm, i1, i2, j1, j2);
	query_(ur[t], il, im, jm, jr, i1, i2, j1, j2);
	query_(dl[t], im, ir, jl, jm, i1, i2, j1, j2);
	query_(dr[t], im, ir, jm, jr, i1, i2, j1, j2);
}

void update(int i, int j, long long x) {
	t_ = update_(t_, 0, r, 0, c, i, j, x);
}

long long calculate(int i1, int j1, int i2, int j2) {
	i2++, j2++;
	ans = 0, query_(t_, 0, r, 0, c, i1, i2, j1, j2);
	return ans;
}
#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...