Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-03-03 08:53:50.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:aib.in, aib.outSursăad-hoc
AutorArhiva EducationalaAdăugată decos_minBondane Cosmin cos_min
Timp execuţie pe test0.175 secLimită de memorie5120 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Arbori indexati binar

Se da un vector A cu N elemente naturale. Asupra lui se vor face M operatii, codificate astfel in fisierul de intrare:
• 0 a b - Sa se determine suma valorilor elementelor intervalului [a,b].
• 1 a b - Valorii elementului de pe pozitia a ii se va adauga valoarea b.

Date de intrare

Pe prima linie a fisierului de intrare se afla N si M. Pe urmatoarea linie se gasesc cele N elemente ale vectorului, iar urmatoarele M linii descriu operatia care trebuie efectuata.

Date de iesire

Pentru fiecare operatie de tip 0, se va afisa pe cate o linie suma valorilor elementelor pentru intervalul cerut (in ordinea ceruta in fisierul de intrare).

Restrictii

  • 1N, M50 000
  • 1Ai10 000 pentru 1 ≤ i ≤ N
  • Pentru operatia de tip 0: 1abN
  • Pentru operatia de tip 1: 1aN si 1b10 000
  • Rezultatul se va incadra pe 32 de biti

Exemplu

aib.inaib.out
6 5
3 8 4 7 8 8
0 1 5
0 6 6
1 4 4
1 2 9
1 1 9
30
8

Solutie

O rezolvare brute a problemei ar obtine in jur de 30 puncte si o poti gasi aici. Solutia optima pentru rezolvare a problemei are complexitate O(MlogN) si se poate realiza in mai multe moduri.
Prima rezovare consta in folosirea arborilor de intervale. O solutie care merge pe ideea aceasta gasesti aici.
A doua solutie se realizeaza intermediul arborilor indexati binar, care foloseste mai putina memorie O(N). O solutie de 100 puncte pe ideea aceasta gasesti aici.

Feedback Cosmin: ar mai trebui adaugat un tip de query care este ignorat de obicei si e destul de util: gasirea elementului i astfel ca suma de a[j] 1 <= j <= i sa fie egala cu k. Aceasta operatie se poate implementa naiv cu cautare binara in O(log^2 n) dar te poti folosi de structura arborelui ca sa o faci in O(log n).

Baga si articolul asta http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees care cred ca e ceva mai bun decat cel al lui Mihai.

Si baga si paperul original http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue3/spe884.pdf

Mentioneaza ca se pot generaliza in mai multe dimensiuni, si ca de obicei daca ai k dimensiuni atunci ei folosesc maxk spatiu, dar daca folosesti un hash map vor folosi n * logk max spatiu, unde max e coordonata maxima si n e numarul de querieuri/updateuri. Cred ca e explicat ceva despre chestia asta in articolul meu de cautari ortogonale.

Alta chestie de mentionat ar fi ca pe arbori indexati binar poti face queriuri de minm nu numai de suma, dar pe intervale 1..x nu x..y.

Probleme similare

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?