2. naloga

Razmazani seznam

Dana je množica A = {a1, ..., an}, katere elementi so cela števila, večja od 0. Poleg tega sta dani še dve konstanti m in v, ki sta tudi celi števili, večji od 0. Definirajmo novo množico B, ki je „razmazana“ različica množice A, in sicer z naslednjim pravilom: celo število x pripada množici B natanko tedaj, ko je za kvečjemu m manjše ali za kvečjemu v večje od nekega elementa množice A (z drugimi besedami: ko za nek i velja ai − m ≤ x ≤ ai + v; ali pa še drugače: B vsebuje poleg vsakega elementa množice A še prejšnjih m in naslednjih v celih števil).

Množice A ne dobimo podane v datoteki ali v kakšni podatkovni strukturi, pač pa je za dostop do množice A na voljo funkcija Naslednji(), ki nam ob vsakem klicu vrne po en element množice A. Vrača jih v naraščajočem vrstnem redu. Ko pride do konca množice (torej od vključno (n + 1)-vega klica naprej), pa odtlej vrača vrednost −1. Vrednosti n vnaprej ne poznamo (dokler torej ne pridemo do konca množice A, ne vemo, kako velika je; lahko je tudi zelo velika).

Napiši program ali podprogram (funkcijo), ki prebere množico A in izpiše elemente množice B. Izpisuje naj jih v naraščajočem vrstnem redu (vsakega natanko enkrat) in to čim bolj sproti; z drugimi besedami, preden prebere naslednji element množice A, naj izpiše vse tiste elemente množice B, za katere lahko iz že doslej prebranih podatkov sklepa, da res pripadajo množici B. Podrobnosti pri formatu izpisa niso pomembne; pišeš lahko na standardni izhod ali pa v datoteko seznam.txt (karkoli ti je lažje). Za konstanti m in v lahko predpostaviš, da sta že deklarirani na začetku tvojega programa, ali pa ju prebereš s standardnega vhoda ali iz datoteke vhod.txt (karkoli ti je lažje).

Primer: če imamo m = 2 in v = 1 ter množico A = {1, 3, 4, 9}, ima množica B naslednje elemente: {−1, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10}. (Pozor: tvoja rešitev ne sme predpostaviti, da so m, v in A takšni kot v tem primeru, ampak mora delovati za poljubne vrednosti m, v in A.)