Submission #1184859

#TimeUsernameProblemLanguageResultExecution timeMemory
1184859stdfloatHorses (IOI15_horses)C++20
37 / 100
77 ms9032 KiB
#include <bits/stdc++.h>
#include "horses.h"
// #include "grader.cpp"
using namespace std;

using ll = long long;

const int md = (int)1e9 + 7;

int n, Z = 1;

vector<int> x(n), y(n);

int pw(int x, int y) {
	int res = 1;
	while (y) {
		if (y & 1) res = (ll)res * x % md;
	
		y >>= 1;
		x = (ll)x * x % md;
	}

	return res;
}

int init(int N, int a[], int b[]) {
	n = N;
	x = y = vector<int>(n);
	for (int i = 0; i < n; i++) {
		x[i] = a[i]; y[i] = b[i];
	}

	for (int i = 0; i < max(n - 60, 0); i++)
		Z = (ll)Z * x[i] % md;

	ll pr = 1;
	int X = Z, ans = 0, lst = -1;
	for (int i = max(n - 60, 0); i < n; i++) {
		pr *= x[i];

		if (md < pr || !~lst || y[lst] < pr * y[i]) {
			X = (ll)X * (pr % md) % md; pr = 1;

			ans = (ll)X * y[i] % md; lst = i;
		}
	}

	return ans;
}

int updateX(int pos, int val) {
	if (pos < max(n - 60, 0)) Z = ((ll)Z * pw(x[pos], md - 2) % md) * val % md;
	x[pos] = val;

	ll pr = 1;
	int X = Z, ans = 0, lst = -1;
	for (int i = max(n - 60, 0); i < n; i++) {
		pr *= x[i];

		if (md < pr || !~lst || y[lst] < pr * y[i]) {
			X = (ll)X * (pr % md) % md; pr = 1;

			ans = (ll)X * y[i] % md; lst = i;
		}
	}

	return ans;
}

int updateY(int pos, int val) {
	y[pos] = val;

	ll pr = 1;
	int X = Z, ans = 0, lst = -1;
	for (int i = max(n - 60, 0); i < n; i++) {
		pr *= x[i];

		if (md < pr || !~lst || y[lst] < pr * y[i]) {
			X = (ll)X * (pr % md) % md; pr = 1;

			ans = (ll)X * y[i] % md; lst = i;
		}
	}

	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...