program posloupnost; const MAX:word=100000; var a:array[1..MAX] of longint; soucty:array[0..MAX] of longint; index:array[0..MAX] of word; X:longint; N:word; type uzel=record hodnota:longint; { hodnota součtu uložená v uzlu } aktivni:boolean; { příznak, zda je hodnota aktivní } akt_strom:boolean; { příznak existence aktivních listů v podstromě, tj. u listu určuje jeho aktivitu } index:word; { určuje délku posloupnosti odp. součtu } levy,pravy:^uzel; end; type puzel=^uzel; var koren:^uzel; procedure bublej_nahoru(odkud, mez: word); { pomocná procedure pro heap-sort - prvek na pozici, odkud je zabubláván směrem nahoru v haldě po velikost určenou parametrem mez } var j1,j2,k:word; begin j2:=odkud; repeat j1:=j2; if (2*j1+1<=mez) and (soucty[j2]hodnota then begin nejblizsi_mensi:=nejblizsi_mensi(u^.levy,hodnota); exit end; vysledek:=nejblizsi_mensi(u^.pravy,hodnota); if vysledek<>-1 then begin nejblizsi_mensi:=vysledek; exit end; if u^.aktivni then begin nejblizsi_mensi:=u^.index; exit end; nejblizsi_mensi:=nejblizsi_mensi(u^.levy,hodnota); end; function nejblizsi_vetsi(u: puzel; hodnota:longint): integer; var vysledek: integer; begin if (u=nil) or (not u^.akt_strom) then begin nejblizsi_vetsi:=-1; exit end; if u^.aktivni and (u^.hodnota=hodnota) then begin nejblizsi_vetsi:=u^.index; exit end; if u^.hodnota-1 then begin nejblizsi_vetsi:=vysledek; exit end; if u^.aktivni then begin nejblizsi_vetsi:=u^.index; exit end; nejblizsi_vetsi:=nejblizsi_vetsi(u^.pravy,hodnota); end; procedure vyres; var soucet: longint; opt_soucet: longint; opt_od, opt_do: word; i: word; k: integer; begin aktivuj(0); aktivuj(a[1]); soucet:=a[1]; opt_soucet:=a[1]; opt_od:=1; opt_do:=1; soucty[0]:=0; for i:=1 to N do soucty[i]:=soucty[i-1]+a[i]; for i:=2 to N do begin soucet:=soucet+a[i]; k:=nejblizsi_mensi(koren,soucet-X); if (k<>-1) and (abs(soucty[i]-soucty[k]-X)-1) and (abs(soucty[i]-soucty[k]-X)