Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-03-05 17:59:21.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:rmq.in, rmq.outSursăad-hoc
AutorArhiva EducationalaAdăugată dedevilkindSavin Tiberiu devilkind
Timp execuţie pe test0.65 secLimită de memorie65536 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Range minimum query

Se da un vector cu N elemente. Scrieti un program care raspunde la M intrebari de tipul "Care este elementul minim din intervalul [x,y]?"

Date de intrare

Pe prima linie a fisierului rmq.in sunt date numerele N si M. Urmatoarele N linii vor contine cate un numar reprezentand elementele vectorului. Urmatoarele M linii vor contine cate 2 numere reprezentand valorile x si y care definesc intrebarile.

Date de iesire

In fisierul de iesire rmq.out vor fi M linii, fiecare continand cate un numar, pe linia i aflandu-se raspunsul pentru intrebarea i.

Restrictii

  • 1 ≤ N ≤ 100 000
  • 1 ≤ M ≤ 1 000 000

Exemplu

rmq.inrmq.out
5 4
1
5
6
4
3
2 4
1 2
3 5
1 4
4
1
3
1

Indicatii de rezolvare

Problema se poate rezolva brut-force, cu complexitatea O(N*M), pentru fiecare interogare parcurgem tot intervalul si afisam minimul. Aceasta rezolvare obtine 30 de puncte. O sursa care foloseste aceasta abordare gasiti aici
Putem de asemenea rezolva problema folosind un arbore de intervale ( vezi problema Arbori de intervale ). Aceasta idee are complexitatea O(NlogN+MlogN) si ar trebui sa obtina 60-70 de puncte. O sursa care foloseste arbori de intervale gasiti aici.
Pentru a obtine 100 de puncte, vom folosi o idee mai simpla decat cea cu arbori de intervale si anume vom folosi algoritmul de Range minimum query care poate fi redus la complexitatea O(NlogN + M).
O descriere mai pe larg a acestui algoritm gasiti aici la problema Plantatie.
Un alt articol interesant este acesta unde este descris atat algoritmul RMQ cat si folosirea lui in determinarea LCA-ului (Lowest Common Ancestor).
Sursa care foloseste aceasta abordare o gasiti aici.
Ideea de la RMQ se poate folosi si la alte operatii cum ar fi la operatia de determinare a celui mai mic divizor comun pentru o subsecventa, de exemplu in problema euclid.

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?