CSES - Tutkimus
  • Time limit: 4.00 s
  • Memory limit: 128 MB

Uolevin sukuyritys myy omenoita torilla, mutta viime vuosina liiketoiminta on ollut raskaasti tappiollista. Niinpä Uolevi tilasi kaveriltaan Jarkalta tutkimuksen siitä, miten omenan kilohinta vaikuttaa liikevoittoon.

Jarkan työn tuloksena syntyi taulukko v0,v1,,vn1v_0,v_1,\ldots,v_{n-1}, missä vkv_k tarkoittaa liikevoittoa, kun omenan kilohinta on kk. Taulukosta selviää, että tiettyyn rajaan asti kilohinnan kasvattaminen lisää liikevoittoa, mutta tämän jälkeen se vähentää liikevoittoa.

Jarkka suhtautuu kuitenkin vakavasti tietoturvaan ja toimitti taulukon kryptattuna. Jokaista taulukon arvoa vkv_k vastaa neljä arvoa aka_k, bkb_k, ckc_k ja dkd_k. Näistä pystyy laskemaan arvon vkv_k käyttämällä seuraavaa algoritmia:

[switch]

int decrypt(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
	for(int i = 0; i < 10000; ++i) {
		c *= a; d ^= a; c *= b; a ^= c; d += b; a += c;
		b -= a; b *= c; c ^= d; c *= d; d ^= a; c += b;
		a ^= c; d -= b; c += b; b *= a; d -= a; c -= d;
		a += c; c ^= b; b *= a; a ^= d; c -= d; d -= a;
		c -= a; d -= b; c += d; b -= c; c += b; c += d;
		b *= c; b -= d; b *= a; b ^= c; d -= b; d -= a;
	}
	
	a %= 1000000u;
	return (int)a - 500000;
}
private static int decrypt(int a, int b, int c, int d) {
	for(int i = 0; i < 10000; ++i) {
		c *= a; d ^= a; c *= b; a ^= c; d += b; a += c;
		b -= a; b *= c; c ^= d; c *= d; d ^= a; c += b;
		a ^= c; d -= b; c += b; b *= a; d -= a; c -= d;
		a += c; c ^= b; b *= a; a ^= d; c -= d; d -= a;
		c -= a; d -= b; c += d; b -= c; c += b; c += d;
		b *= c; b -= d; b *= a; b ^= c; d -= b; d -= a;
	}
	
	while(a < 0) a -= 1000000000;
	a %= 1000000;
	return a - 500000;
}

[/switch]

Ongelmana on kuitenkin, että algoritmin silmukassa on 10000 kierrosta ja arvojen purkaminen on hidasta. Voisitko auttaa Uolevia etsimään aineistosta tehokkaasti kilohinnan, joka tuottaa suurimman liikevoiton?

Syöte

Syötteen ensimmäisellä rivillä on luku nn, taulukon vv koko.

Seuraavaksi syötteessä on jokaiselle k=0,1,,n1k = 0, 1, \ldots, n-1 yksi rivi, jossa on välein eroteltuna luvut aka_k, bkb_k, ckc_k ja dkd_k.

Tuloste

Ohjelman tulee tulostaa yksi rivi, jolla on kilohinta hh siten, että vhv_h on suurin mahdollinen.

Rajat

  • 2n1052 \leq n \leq 10^5
  • 0ak,bk,ck,dk<1060 \leq a_k, b_k, c_k, d_k < 10^6
  • 5105vk<5105-5\cdot 10^5 \leq v_k < 5 \cdot 10^5
  • v0<<vh1<vh>vh+1>>vn1v_0 < \ldots < v_{h - 1} < v_h > v_{h + 1} > \ldots > v_{n-1}

Esimerkki

Syöte:

4
879479 618085 843425 972716
232376 383233 639282 763757
252843 370229 101963 278328
8702 979114 391694 473238

Tuloste:

2

Syötteessä taulukko vv on [-90601, 149544, 241747, 237726], ja maksimi löytyy kohdasta 2 (241747).

[rem]
Eräänä kauniina aamuna Uolevi heräsi siihen tosiasiaan, että hänen uransa vapaana tutkijana ei kerrytä hänelle kovinkaan kummoista eläkettä. Siksi Uolevi päätti alkaa yrittäjäksi, liikeideanaan myydä torilla omenoita. Kuitenkin liiketoiminta on tähän mennessä ollut raskaasti tappiollista. Uolevi epäilee syyksi väärää hinnoittelua. Siksi hän tilaa Annalta laajan markkinatutkimuksen, jonka tarkoituksena on selvittää paras mahdollinen hinnoittelu.

Tutkimuksen tuloksena Anna tuottaa taulukon V0,V1,,Vn1V_0, V_1, \ldots, V_{n - 1}, missä ViV_i on Uolevin arvioitu liikevoitto mikäli omenan kilohinnaksi asetetaan ii. Sopimuksen mukaisesti Anna toimittaa taulukon Uoleville ennen deadlinea. Anna on kuitenkin salannut taulukon hyvien tietoturvanormien mukaisesti itse keksimällään salausalgoritmilla, ja toimittaa Uoleville purkuohjelman vasta, kun maksu on suoritettu.

Tappiollisen liiketoiminnan seurauksena Uolevin käteiskassa on kuitenkin melkein tyhjä, ja luottotiedotkaan eivät ole enää kunnossa. Kunnian miehenä Uolevi aikoo tietysti maksaa Annalle tehdystä työstä, mutta se on mahdollista vasta kun Uolevi saa liiketoimintansa taas voitolliseksi. Ainoaksi vaihtoehdoksi jää siis Annan salauksen murtaminen.

Annan salauksessa luku ViV_i esitetään neljänä lukuna Ai,Bi,Ci,DiA_i, B_i, C_i, D_i. Monen yön uurastuksen jälkeen Uolevi on onnistunut keksimään seuraavan C++-funktion, joka osaa selvittää luvun ViV_i luvuista Ai,Bi,Ci,DiA_i, B_i, C_i, D_i:

int decrypt(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
	for(int i = 0; i < 10000; ++i) {
		c *= a; d ^= a; c *= b; a ^= c; d += b; a += c;
		b -= a; b *= c; c ^= d; c *= d; d ^= a; c += b;
		a ^= c; d -= b; c += b; b *= a; d -= a; c -= d;
		a += c; c ^= b; b *= a; a ^= d; c -= d; d -= a;
		c -= a; d -= b; c += d; b -= c; c += b; c += d;
		b *= c; b -= d; b *= a; b ^= c; d -= b; d -= a;
	}
	
	a %= 1000000u;
	return (int)a - 500000;
}

Kuitenkin tällä funktiolla koko taulukon VV lukujen selvittämiseen menisi Uolevin tietokoneella kauemmin kuin mitä Uolevilla on aikaa. Uolevilla ei myöskään ole rahaa uuteen tietokoneeseen. Uolevi tahtoo tietää vain hinnan hh jolla VhV_h on suurin mahdollinen. Uolevi muistaa Annan loppuraportista, että taulukon VV arvot ensin kasvavat ja sitten laskevat.

Syöte

Syötteen ensimmäisellä rivillä on luku nn, taulukon VV pituus. Seuraavaksi syötteessä on jokaiselle i=0,1,,n1i = 0, 1, \ldots, n - 1 yksi rivi, jossa on välein eroteltuna luvut AiA_i, BiB_i, CiC_i ja DiD_i.

Tuloste

Ohjelman tulee tulostaa yksi rivi, jolla on luku hh siten, että VhV_h on suurin mahdollinen.

Rajat

2n1052 \leq n \leq 10^5
0Ai,Bi,Ci,Di<1060 \leq A_i, B_i, C_i, D_i < 10^6
5105Vi<5105-5\cdot 10^5 \leq V_i < 5\cdot 10^5
V0<V1<<Vh1<Vh>Vh+1>>Vn2>Vn1V_0 < V_1 < \ldots < V_{h - 1} < V_h > V_{h + 1} > \ldots > V_{n - 2} > V_{n - 1}

Esimerkki

Syöte:

4
879479 618085 843425 972716
232376 383233 639282 763757
252843 370229 101963 278328
8702 979114 391694 473238

Tuloste:

2

Syötteessä taulukko V on [-90601, 149544, 241747, 237726], ja maksimi löytyy kohdasta 2 (241747).
[/rem]