Submission #819975

#TimeUsernameProblemLanguageResultExecution timeMemory
819975KerimHorses (IOI15_horses)C++17
100 / 100
296 ms101028 KiB
#include "horses.h"
#include "bits/stdc++.h"
using namespace std;

const int MAXN = 5e5+5;
const int INF = 1e9+7;
int a[MAXN], b[MAXN], n;
long double pref[MAXN];

struct node{
	int mul;
	int ans;
	long double p;
	node(){
		mul = ans = 0;
		p = 0;
	}
	node(int _mul, int _ans){
		mul = _mul;
		ans = _ans;
	}
}s[MAXN<<2];

node merge(node x, node y){
	node z = node(0, 0);
	if (x.p < y.p)
		z.ans = y.ans, z.p = y.p;
	else
		z.ans = x.ans, z.p = x.p;
	z.mul = (x.mul * 1LL * y.mul) % INF;
	return z;
}

void build(int nd, int x, int y){
	if (x == y){
		s[nd].ans = x;
		s[nd].mul = a[x];
		s[nd].p = pref[x];
		return;
	}
	int mid = (x+y) >> 1;
	build(nd<<1, x, mid);
	build(nd<<1|1, mid+1, y);
	s[nd] = merge(s[nd<<1], s[nd<<1|1]);
}
long double lazy[MAXN<<2];
void shift(int nd){
	long double &ret = lazy[nd];
	lazy[nd<<1] += ret; s[nd<<1].p += ret;
	lazy[nd<<1|1] += ret; s[nd<<1|1].p += ret;
	ret = 0;
}
void inc(int l, int r, long double val, int nd, int x, int y){
	if (l > y or x > r)
		return;
	if (l <= x and y <= r){
		s[nd].p += val;
		lazy[nd] += val;
		return;
	}
	shift(nd);
	int mid = (x+y) >> 1;
	inc(l, r, val, nd<<1, x, mid);
	inc(l, r, val, nd<<1|1, mid+1, y);
	s[nd] = merge(s[nd<<1], s[nd<<1|1]);
}

void upd(int p, long double val, int nd, int x, int y){
	if (x == y){
		s[nd].mul = a[p];
		s[nd].p += val;
		return;
	}
	shift(nd);
	int mid = (x+y) >> 1;
	if (p <= mid)
		upd(p, val, nd<<1, x, mid);
	else	
		upd(p, val, nd<<1|1, mid+1, y);
	s[nd] = merge(s[nd<<1], s[nd<<1|1]);
}

int get(int l, int r, int nd, int x, int y){
	if (l > y or x > r)
		return 1;
	if (l <= x and y <= r)
		return s[nd].mul;
	int mid = (x+y) >> 1;
	return (get(l, r, nd<<1, x, mid) *1LL* get(l, r, nd<<1|1, mid+1, y)) % INF;
}

int ask(int pos){
	return (get(0, pos, 1, 0, n-1) *1LL* b[pos]) % INF;
}

int init(int N, int X[], int Y[]) {
	n = N;
	long double sum = 0;
	for (int i = 0; i < n; i++){
		a[i] = X[i], b[i] = Y[i];
		sum += log(a[i]);
		pref[i] = sum + log(b[i]);
	}
	build(1, 0, n-1);
	return ask(s[1].ans);
}

int updateX(int pos, int val) {	
	inc(pos, n-1, -log(a[pos]) + log(val), 1, 0, n-1);
	a[pos] = val;
	upd(pos, 0, 1, 0, n-1);
	return ask(s[1].ans);
}

int updateY(int pos, int val) {
	upd(pos, log(val) - log(b[pos]), 1, 0, n-1);
	b[pos] = val;
	return ask(s[1].ans);
}

Compilation message (stderr)

horses.cpp: In function 'node merge(node, node)':
horses.cpp:30:32: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   30 |  z.mul = (x.mul * 1LL * y.mul) % INF;
      |          ~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int get(int, int, int, int, int)':
horses.cpp:89:71: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   89 |  return (get(l, r, nd<<1, x, mid) *1LL* get(l, r, nd<<1|1, mid+1, y)) % INF;
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int ask(int)':
horses.cpp:93:47: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   93 |  return (get(0, pos, 1, 0, n-1) *1LL* b[pos]) % INF;
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#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...