Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- type g = record index,m:integer; end;
- var x,a,c:g;
- h:array[1..1000] of g;
- b:array[1..1000,1..2] of integer;
- n,m,i,k,s:integer;
- procedure swap(i,j:integer);
- var t:g;
- begin
- t:=h[i];
- h[i]:=h[j];
- h[j]:=t;
- end;
- procedure push(x:g);
- var k:integer;
- begin
- inc(n);
- h[n]:=x;
- k:=n;
- while (k>1) and (h[k].m<h[k div 2].m) do
- begin
- swap(k,k div 2);
- k:=k div 2;
- end;
- end;
- function getmin:g;
- var k,mini:integer;
- minx:g;
- begin
- getmin:=h[1];
- h[1]:=h[n];
- dec(n);
- k:=1;
- while (k<=n) do
- begin
- mini:=k;
- minx:=h[k];
- if (2*k<=n) and (h[2*k].m<minx.m) then begin minx:=h[2*k]; mini:=2*k; end;
- if (2*k+1<=n) and (h[2*k+1].m<minx.m) then begin minx:=h[2*k+1]; mini:=2*k+1; end;
- if mini=k then exit;
- swap(mini,k);
- k:=mini;
- end;
- end;
- begin
- n:=0; s:=0;
- k:=0;
- readln(m);
- for i:=1 to m do
- begin
- read(x.m);
- x.index:=i;
- push(x);
- if (i mod 3=0) or (i=m) then
- begin
- inc(k);
- if i=m then begin if i mod 2=1 then begin a:=getmin; b[k,1]:=a.index; s:=s+a.m;end; end; end;
- if ((i=m) and (i mod 2=0)) or (i mod 3 =0) then begin a:=getmin; c:=getmin; b[k,1]:=a.index; b[k,2]:=c.index; if a.m>c.m then s:=s+a.m else s:=s+c.m; end;
- end;
- if n=2 then begin inc(k); a:=getmin; c:=getmin; b[k,1]:=a.index; b[k,2]:=c.index; if a.m>c.m then s:=s+a.m else s:=s+c.m; end;
- writeln(s);
- for i:=1 to k do
- begin
- if b[i,2]<>0 then writeln(b[i,1],' ',b[i,2])
- else writeln(b[i,1]);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement