Submission #1178464

#TimeUsernameProblemLanguageResultExecution timeMemory
1178464sleepntsheepHorses (IOI15_horses)C11
100 / 100
89 ms33196 KiB
#include "horses.h"
#include <stdio.h>
#include <math.h>

const int M=1000000007;

int n, y[555555], x[555555];

typedef struct A{ double sm,mx; int ans,mul; } A;
A t[1111111];

void pul(int i){
	t[i].mul=t[i*2].mul*1ll*t[i*2+1].mul%M;
	t[i].sm=t[i*2].sm+t[i*2+1].sm;
	if(t[i*2].mx>=t[i*2].sm+t[i*2+1].mx){
		t[i].mx=t[i*2].mx;
		t[i].ans=t[i*2].ans;
	}else{
		t[i].mx=t[i*2].sm+t[i*2+1].mx;
		t[i].ans=t[i*2].mul*1ll*t[i*2+1].ans%M;
	}
}

void o(int i){
	t[i+n]=(A){ log(x[i]),log(x[i])+log(y[i]), x[i]*1ll*y[i]%M,x[i] };
}
void u(int i){
	for(int p=i+n;p/=2;)pul(p);
}

int init(int N, int X[], int Y[]) {
	n=N;
	while((n&(n-1)))++n;
	for(int i=0;i<N;++i) x[i]=X[i],y[i]=Y[i], o(i);
	for(int i=n;--i;)pul(i);
	return t[1].ans;
}

int updateX(int i, int val) {
	x[i]=val;
	o(i);u(i);
	return t[1].ans;
}

int updateY(int pos, int val) {
	y[pos]=val;
	o(pos);u(pos);
	return t[1].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...