Măsură

Time limit: 1s Memory limit: 64MB Input: Output:

Sistemul imperial de unități de măsură, folosit în SUA, este un adevărat haos (vezi imaginea de mai jos!). Mai mult, americanii sunt încăpățânați și nu vor să folosească sistemul metric, așa că, momentan, trebuie să deslușim misterul transformării dintr-o unitate de măsură în alta, fiind date o serie de reguli de transformare.

Cerință

Se dau mai multe reguli de transformare de tipul ! 1000 m km, însemnând 1000 m=1 km1000 \text{ m} = 1 \text{ km}. În același timp, se dau întrebări de tipul ? 54.8 km m, însemnând 54,8 km=? m54,8 \text{ km} = ? \text{ m} (transformă 54,8 km54,8 \text{ km} în m\text{m}).

Răspundeți la întrebări, folosind doar regulile de transformare date înainte de acestea!

Date de intrare

Prima linie conține un număr natural tt, numărul de teste. Pentru fiecare test se va afișa un număr natural nn. Pe următoarele nn linii ale testului se vor afla cvadruplete de tipul (caracter, șir de caractere, număr real, șir de caractere). Primul element (caracterul) poate fi doar ! (care simbolizează o regulă de transformare) sau ? (care simbolizează o întrebare).

Date de ieșire

Se vor afișa răspunsurile la întrebări pe linii separate (linia ii va conține răspunsul la întrebarea ii). Toate numerele afișate vor fi numere naturale. Se va afișa răspunsul la întrebare rotunjit la cel mai apropiat număr întreg. Dacă nu se pot transforma unitățile folosind regulile date, se va afișa -1.

Pentru a afișa variabila x de tip double/long double rotunjită la cel mai apropiat număr întreg, includeți biblioteca cmath și folosiți instrucțiunea std::cout << (long long)std::round(x);.

Restricții și precizări

  • Se recomandă folosirea tipurilor de date double sau long double (în loc de float) pentru reprezentarea numerelor reale.
  • 1t1001 \leq t \leq 100
  • 2n100002 \leq n \leq 10000
  • Se dau cel puțin două unități și cel puțin o întrebare.
  • Șirurile de caractere reprezentând unitățile de măsură au lungime de minim 11 și maxim 44 și sunt formate din litere mici ale alfabetului englez.
  • Numerele reale din întrebări sunt cuprinse între 00 și 10001000 inclusiv.
  • Se garantează că valorile tuturor rapoartelor dintre unități sunt cuprinse între 00 exclusiv și 101110^{11} inclusiv (ceea ce nu depășește tipurile double/long double).
  • În cadrul regulilor nu vor exista „cicluri” (de exemplu, dacă se dau regulile de transformare din ft\text{ft} în yd\text{yd}, din ft\text{ft} în pt\text{pt} și din mi\text{mi} în pt\text{pt}, atunci în mod sigur nu se va da regula de transformare din mi\text{mi} în yd\text{yd} sau din ft\text{ft} în mi\text{mi}).
  • Pentru transformarea între două unități se va da cel mult câte o regulă.
  • O unitate de măsură se poate „transforma” în ea însăși chiar dacă nu a fost definită!
  • Pentru 70 de puncte, toate regulile de transformare vor fi date înaintea primei întrebări!
  • Pentru citirea și afișarea rapidă, se recomandă folosirea acestor linii de cod la începutul funcției main:
ios::sync_with_stdio(false);  
cin.tie(NULL);  
cout.tie(NULL);  

Exemplu

stdin

2
8
! 1000 m km
! 0.001 m mm
? 0.36 km mm
? 79 km cm
! 10 mm cm
? 79 km cm
! 60 min h
? 135 m min
11
! 12 pt pica
! 20 twip pt
! 63 pt fng
! 0.875 in fng
? 250 pt in
! 8 fur mi
! 1760 yd mi
? 0.35 twip fur
! 12 in ft
! 3 ft yd
? 0.5 fur twip

stdout

360000
-1
7900000
-1
3
-1
5702400

Explicație

Avem două teste (cel cu m\text{m}, km\text{km}, mm\text{mm} etc. și cel cu pt\text{pt}, pica\text{pica}, twip\text{twip} etc.)
0,36 km=0,361000 m=0,3610000,001 mm=360000 mm0,36 \text{ km} = 0,36 \cdot 1000 \text{ m} = \frac{0,36 \cdot 1000}{0,001} \text{ mm} = 360 000 \text { mm}.
Folosind doar regulile date înaintea celei de-a doua întrebări, nu se poate transforma din km\text{km} în cm\text{cm}.
Pentru întrebarea a treia, mai avem în plus o regulă de transformare din mm\text{mm} în cm\text{cm}. Astfel, 79 km=791000 m=7910000.001 mm=7910000.00110 cm=7900000 cm79 \text{ km} = 79 \cdot 1000 \text{ m} = \frac{79 \cdot 1000}{0.001} \text{ mm} = \frac{79 \cdot 1000}{0.001 \cdot 10} \text{ cm} = 7 900 000 \text{ cm}.
Pentru ultima întrebare a primului test, nu se poate transforma din m\text{m} în min\text{min} folosind regulile date.

Log in or sign up to be able to send submissions!