Cod sursa(job #294463)

Utilizator bixcabc abc bixc Data 2 aprilie 2009 16:00:55
Problema Arbori indexati binar Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.82 kb
// Arhiva educationala - Arbori de intervale
var
	n, m, i2, i, t, a, b : longint;
	v : array[1..250100] of longint;
	f, g : text;

function query   (nod, st, dr, a, b : longint) : longint;
var
	mij, t : longint;
	m1, m2 : longint;
begin
	if (a <= st) and (dr <= b) then begin
		query := v[nod]; exit
	end;
	mij := (st+dr) shr 1; m1 := 0; m2 := 0;
	t := nod shl 1; 
	if (a <= mij) then
		m1 := query (t, st, mij, a, b);
	if (mij < b) then
		m2 := query (t + 1, mij+1, dr, a, b);
	query := m1 + m2;
end;

function query2   (nod, st, dr, a : longint) : longint;
var
	mij, t : longint;
begin
	if a>v[nod] then begin
		query2 := -1; exit;
	end;
	if (a = v[nod]) and (st=dr) or (a=0) then begin
		query2 := st; exit;
	end;
	mij := (st+dr) shr 1;
	t := nod shl 1; 
	if (v[t] >= a) then
		query2 := query2 (t, st, mij, a)
	else
		query2 := query2 (t + 1, mij+1, dr, a - v[t]);
end;


procedure update (nod, st, dr, poz, val : longint);
var
    mij, t: longint;
begin
	if (st = poz) and (dr = poz) then begin 
		v[nod] := v[nod] + val; exit; 
	end;
	mij := (st + dr) shr 1;
	t := nod shl 1;
	if (poz <= mij) then
		update (t, st, mij, poz, val)
	else
		update (t + 1, mij+1, dr, poz, val);
	v[nod] := v[t] + v[t+1];
end;


begin
assign	(f, 'aib.in');		assign 	(g, 'aib.out');
reset	(f);				rewrite	(g);
readln	(f, n, m);

for i := 1 to n do
    begin read (f, a); update(1, 1, n, i, a); end;

readln	(f);
for i := 1 to m do
	begin
	read	(f, t);
	if (t = 0) then
        begin
        readln  (f, a, b);
		update	(1, 1, n, a, b)
        end
    else
	if (t = 1) then
        begin
        readln  (f, a, b);
		writeln	(g, query (1, 1, n, a, b))
        end
	else
        begin
        readln  (f, a);
		writeln	(g, query2 (1, 1, n, a));
        end;
	end;
close	(f);				close	(g);
end.