Submission #1245071

#TimeUsernameProblemLanguageResultExecution timeMemory
1245071caacrugonHorses (IOI15_horses)C++20
100 / 100
236 ms91440 KiB
#include <bits/stdc++.h>
#include "horses.h"

using namespace std;
#define ll long long
#define mkp make_pair
#define pb push_back
#define f first
#define s second

ll mod=1e9+7;

struct info{
	ll gan,val,po;
	double lgan,lval;
};

ll n;
vector<pair<ll,ll>> ln;
vector<info> segtree;

info merge(info left, info rigth){
	info ans;
	ans.gan=(left.gan*rigth.gan)%mod;
	ans.lgan=left.lgan+rigth.lgan;
	double nlogc=left.lgan+rigth.lval;
	ll ngamc=(left.gan*rigth.val)%mod;
	if(left.lval>=nlogc){
		ans.val=left.val;
		ans.lval=left.lval;
		ans.po=left.po;
	}else{
		ans.val=ngamc;
		ans.lval=nlogc;
		ans.po=rigth.po;
	}
	return ans;
}

void uptade(ll no, ll l, ll r, ll x, ll v, ll in){
	if(l==r){
		segtree[no].val=(v*in)%mod;
		segtree[no].lval=log((double)in*(double)v);
		segtree[no].po=x;
		segtree[no].gan=in;
		segtree[no].lgan=log((double)in);
		return;
	}
	ll m=l+((r-l)/2);
	if(x<=m) uptade(no*2, l, m, x, v, in);
	else uptade(no*2+1, m+1, r, x, v, in);
	segtree[no]=merge(segtree[no*2],segtree[no*2+1]);
	return;
}

int init(int N, int X[], int Y[]) {
	n=N;
	ln.reserve(N+1);
	segtree.resize(N*4+10);
	for(int i=0;i<n;i++){
		ln.pb(mkp(X[i],Y[i]));
		uptade(1,0,N-1,i,Y[i],X[i]);
	}
	return segtree[1].val;
}

int updateX(int pos, int val) {	
	ln[pos].f=val;
	uptade(1,0,n-1,pos,ln[pos].s,val);
	return segtree[1].val;
}

int updateY(int pos, int val) {
	ln[pos].s=val;
	uptade(1,0,n-1,pos,val,ln[pos].f);
	return segtree[1].val;
}
#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...