Submission #1013217

#TimeUsernameProblemLanguageResultExecution timeMemory
1013217AmirAli_H1Game (IOI13_game)C++17
10 / 100
13090 ms9932 KiB
// In the name of Allah

#include <bits/stdc++.h>
#include "game.h"
using namespace std;

typedef		long long int			ll;
typedef		long double				ld;
typedef		pair<int, int>			pii;
typedef		pair<ll, ll>			pll;
typedef		complex<ld>				cld;

#define		all(x)					(x).begin(),(x).end()
#define		len(x)					((ll) (x).size())
#define		F						first
#define		S						second
#define		pb						push_back
#define		sep						' '
#define		endl					'\n'
#define		Mp						make_pair
#define		kill(x)					cout << x << '\n', exit(0)
#define		set_dec(x)				cout << fixed << setprecision(x);
#define		file_io(x,y)			freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int sq = 150;
const int maxn = sq * sq;
const int maxlg = 15;
vector<int> arr1, arr2;
vector<pair<pll, ll>> A;
vector<pll> Ax[maxn], Asq[sq];
int indx[maxn], indsq[maxn];
ll Rx[maxn][maxlg], Rsq[maxn][maxlg];

int GI1(int x) {
	return lower_bound(all(arr1), x) - arr1.begin();
}
int GI2(int x) {
	return lower_bound(all(arr2), x) - arr2.begin();
}

int Gx(int i, int r) {
	return indx[r] + i;
}
int Gsq(int i, int r) {
	return indsq[r] + i;
}

void addx(int R) {
	for (int x : arr1) {
		if (R == x) return ;
	}
	arr1.pb(R); int j = len(arr1) - 1;
	while (j - 1 >= 0 && arr1[j] < arr1[j - 1]) {
		swap(arr1[j], arr1[j - 1]); j--;
	}
}

void add_val(pair<pll, ll> R) {
	int j = 0;
	for (auto f : A) {
		if (R.F == f.F) {
			A[j].S = R.S;
			return ;
		}
		j++;
	}
	A.pb(R); j = len(A) - 1;
	while (j - 1 >= 0 && A[j] < A[j - 1]) {
		swap(A[j], A[j - 1]); j--;
	}
}

void init(int R, int C) {
	return ;
}

void calx(int ind) {
	int n = len(Ax[ind]);
	for (int i = n - 1; i >= 0; i--) {
		Rx[Gx(i, ind)][0] = Ax[ind][i].S;
		for (int j = 1; j < maxlg; j++) {
			int k = i + (1 << (j - 1));
			if (k >= n) break;
			Rx[Gx(i, ind)][j] = __gcd(Rx[Gx(i, ind)][j - 1], Rx[Gx(k, ind)][j - 1]);
		}
	}
}

void calsq(int ind) {
	int n = len(Asq[ind]);
	for (int i = n - 1; i >= 0; i--) {
		Rsq[Gsq(i, ind)][0] = Asq[ind][i].S;
		for (int j = 1; j < maxlg; j++) {
			int k = i + (1 << (j - 1));
			if (k >= n) break;
			Rsq[Gsq(i, ind)][j] = __gcd(Rsq[Gsq(i, ind)][j - 1], Rsq[Gsq(k, ind)][j - 1]);
		}
	}
}

void update(int i, int j, ll x) {
	addx(i); swap(arr1, arr2); addx(j); swap(arr1, arr2);
	add_val(Mp(Mp(i, j), x));
	for (int i = 0; i < len(arr2); i++) Ax[i].clear();
	for (int i = 0; i < len(arr2); i += sq) Asq[i / sq].clear();
	for (auto f : A) {
		int i = GI1(f.F.F), j = GI2(f.F.S); ll x = f.S;
		Ax[j].pb(Mp(i, x));
		Asq[j / sq].pb(Mp(i, x));
	}
	for (int i = 0; i < len(arr2); i++) {
		if (i == 0) indx[i] = 0;
		else indx[i] = len(Ax[i - 1]) + indx[i - 1];
		calx(i);
	}
	for (int i = 0; i < len(arr2); i += sq) {
		if (i == 0) indsq[i] = 0;
		else indsq[i] = len(Asq[i - 1]) + indsq[i - 1];
		calsq(i / sq);
	}
}

ll get_val(int ind, int l, int r) {
	l = lower_bound(all(Ax[ind]), (pll) Mp(l, -1)) - Ax[ind].begin();
	r = lower_bound(all(Ax[ind]), (pll) Mp(r, -1)) - Ax[ind].begin();
	if (r - l <= 0) return 0;
	int j = __lg(r - l);
	return __gcd(Rx[Gx(l, ind)][j], Rx[Gx(r - (1 << j), ind)][j]);
}

ll get_valx(int ind, int l, int r) {
	l = lower_bound(all(Asq[ind]), (pll) Mp(l, -1)) - Asq[ind].begin();
	r = lower_bound(all(Asq[ind]), (pll) Mp(r, -1)) - Asq[ind].begin();
	if (r - l <= 0) return 0;
	int j = __lg(r - l);
	return __gcd(Rsq[Gsq(l, ind)][j], Rsq[Gsq(r - (1 << j), ind)][j]);
}

ll calculate(int l1, int l2, int r1, int r2) {
	r1++; r2++;
	l1 = GI1(l1); r1 = GI1(r1);
	l2 = GI2(l2); r2 = GI2(r2);
	ll res = 0;
	if (r2 - l2 <= 2 * sq) {
		for (int i = l2; i < r2; i++) {
			res = __gcd(res, get_val(i, l1, r1));
		}
	}
	else {
		int lx = (l2 / sq) + (l2 % sq != 0), rx = r2 / sq;
		for (int i = l2; i < lx; i++) {
			res = __gcd(res, get_val(i, l1, r1));
		}
		for (int i = lx; i < rx; i += sq) {
			res = __gcd(res, get_valx(i / sq, l1, r1));
		}
		for (int i = rx; i < r2; i++) {
			res = __gcd(res, get_val(i, l1, r1));
		}
	}
	return res;
}
#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...