Submission #1282631

#TimeUsernameProblemLanguageResultExecution timeMemory
1282631Jawad_Akbar_JJ말 (IOI15_horses)C++20
17 / 100
1596 ms30804 KiB
#include <iostream>
#include <set>
#include "horses.h"

using namespace std;
#define ll long long
const int N = 1<<17;
int X[N<<2], Mx[N<<1];
ll prd, mod = 1e9 + 7;
set<int> st;

void insert(int i, int vl, int cur = 1, int st = 1, int en = N){
	if (i >= en or i < st)
		return;
	if (en - st == 1){
		Mx[cur] = vl;
		return;
	}
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	insert(i, vl, lc, st, mid);
	insert(i, vl, rc, mid, en);
	Mx[cur] = max(Mx[lc], Mx[rc]);
}

int get(int l, int r, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return 0;
	if (l <= st and r >= en)
		return Mx[cur];
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	return max(get(l, r, lc, st, mid), get(l, r, rc, mid, en));
}

int power(int a, int b){
	if (b == 1)
		return a;
	ll ans = power(a, b / 2);
	ans = ans * ans % mod;
	if (b % 2)
		ans = ans * a % mod;
	return ans;
}

int Answer(){
	ll pd = prd, lst = N, sufMax = 0;
	auto it = st.end();

	while (it != begin(st)){
		it =  prev(it);
		pd = pd * power(X[*it], mod - 2) % mod;
		sufMax = max(sufMax, (ll)get(*it, lst)) * X[*it];
		if (sufMax > mod)
			return sufMax % mod * pd;
		lst = *it;
	}
	return sufMax % mod;
}

int init(int n, int x[], int y[]){
	prd = 1;
	for (int i=1;i<=n;i++){
		X[i] = x[i-1];
		prd = prd * X[i] % mod;
		insert(i, y[i-1]);
		if (x[i-1] > 1 or i == 1)
			st.insert(i);
	}

	return Answer();
}

int updateX(int id, int val){
	id++;
	if (X[id] > 1 or id == 1)
		st.erase(id);
	prd = prd * val % mod * power(X[id], mod - 2) % mod;
	X[id] = val;

	if (X[id] > 1 or id == 1)
		st.insert(id);

	return Answer();
}

int updateY(int id, int val){
	id++;
	insert(id, val);

	return Answer();
}
#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...