Submission #1149838

#TimeUsernameProblemLanguageResultExecution timeMemory
1149838mychecksedadHorses (IOI15_horses)C++20
100 / 100
928 ms46064 KiB
/* Author : Mychecksdead  */
#include "horses.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 3e6+100, M = 1e5+10, K = 52, MX = 30;
ll INF = MOD;
ll x[N], y[N], S[N], V[N];
array<ll, 2> T[N];
int n;
ll get2(int l, int r, int ql, int qr, int k){
	if(ql > r || l > qr) return 1ll;
	if(ql <= l && r <= qr) return V[k];
	int m = l+r>>1;
	return get2(l, m, ql, qr, k<<1) * get2(m+1, r, ql, qr, k<<1|1) % MOD;
}
ll get(int l, int r, int ql, int qr, int k){
	if(ql > r || l > qr) return 1ll;
	if(ql <= l && r <= qr) return S[k];
	int m = l+r>>1;
	return min(INF, get(l, m, ql, qr, k<<1) * get(m+1, r, ql, qr, k<<1|1));
}
array<ll, 2> comb(array<ll, 2> a, array<ll, 2> b){
	ll f = get(0, n - 1, a[0] + 1, b[0], 1);
	if(f * b[1] > a[1]) return b;
	return a; 
}
void UPD(int l, int r, int ql, int qr, int k){
	if(ql > r || l > qr) return;
	if(ql <= l && r <= qr){
		if(l==r) return;
		T[k] = comb(T[k<<1], T[k<<1|1]);
	}else{
		int m = l+r>>1;
		UPD(l, m, ql, qr, k<<1);
		UPD(m+1, r, ql, qr, k<<1|1);
		T[k] = comb(T[k<<1], T[k<<1|1]);
	}
}
void upd(int l, int r, int pos, int k, ll val){
	if(l==r){
		x[l]=val;
		S[k]=x[l];
		V[k]=x[l];
	}else{
		int m= l+r>>1;
		if(pos<=m) upd(l,  m, pos,k<<1, val);
		else upd(m+1, r, pos, k<<1|1, val);
		T[k] = comb(T[k<<1], T[k<<1|1]);
		S[k] = min(S[k<<1] * S[k<<1|1], INF);
		V[k] = V[k<<1] * V[k<<1|1] % MOD;
	}
}
void upd2(int l, int r, int pos, int k, ll val){
	if(l==r){
		y[l]=val;
		T[k]={l, y[l]};
	}else{
		int m= l+r>>1;
		if(pos<=m) upd2(l,  m, pos,k<<1, val);
		else upd2(m+1, r, pos, k<<1|1, val);
		T[k] = comb(T[k<<1], T[k<<1|1]);
		S[k] = min(S[k<<1] * S[k<<1|1], INF);
		V[k] = V[k<<1] * V[k<<1|1] % MOD;
	}
}
void build(int l, int r, int k){
	if(l==r){
		T[k]={l, y[l]};
		return;
	}
	int m = l+r>>1;
	build(l, m, k<<1);
	build(m+1, r, k<<1|1);
	T[k] = comb(T[k<<1], T[k<<1|1]);
}

void build2(int l, int r, int k){
	if(l==r){
		S[k] = x[l];
		V[k] = x[l];
		return;
	}
	int m = l+r>>1;
	build2(l, m, k<<1);
	build2(m+1, r, k<<1|1);
	S[k] = min(S[k<<1] * S[k<<1|1], INF);
	V[k] = V[k<<1] * V[k<<1|1] % MOD;
}

int init(int nn, int X[], int Y[]) {
	n=nn;
	for(int i = 1; i <= n; ++i){
		x[i-1]=X[i-1];
		y[i-1]=Y[i-1];
	}
	build2(0, n-1, 1);
	build(0, n-1, 1);
	int pos = T[1][0];
	return get2(0, n-1, 0, pos, 1) * y[pos] % MOD;
}

int updateX(int pos, int val) {	
	upd(0, n-1, pos, 1,val);
	UPD(0,n-1, pos, n, 1);
	int poss = T[1][0];
	return get2(0, n-1, 0, poss, 1) * y[poss] % MOD;
}

int updateY(int pos, int val) {
	upd2(0, n-1, pos, 1,val);
	int poss = T[1][0];
	return get2(0, n-1, 0, poss, 1) * y[poss] % MOD;
}
#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...