program MergeRanges;
type
TRange = record
StartVal : Integer;
EndVal : Integer;
end;
const
MaxRanges = 20;
var
Ranges : array[1..MaxRanges] of TRange;
Merged : array[1..MaxRanges] of TRange;
N, M, I, J : Integer;
Temp : TRange;
begin
{ Input ranges }
N := 5;
Ranges[1].StartVal := 302; Ranges[1].EndVal := 447;
Ranges[2].StartVal := 488; Ranges[2].EndVal := 489;
Ranges[3].StartVal := 121; Ranges[3].EndVal := 234;
Ranges[4].StartVal := 200; Ranges[4].EndVal := 421;
Ranges[5].StartVal := 140; Ranges[5].EndVal := 354;
{ Sort by StartVal (simple bubble sort for clarity) }
for I := 1 to N - 1 do
for J := I + 1 to N do
if Ranges[J].StartVal < Ranges[I].StartVal then
begin
Temp := Ranges[I];
Ranges[I] := Ranges[J];
Ranges[J] := Temp;
end;
{ Merge }
M := 0;
for I := 1 to N do
begin
if (M = 0) or (Ranges[I].StartVal > Merged[M].EndVal) then
begin
Inc(M);
Merged[M] := Ranges[I];
end
else
begin
if Ranges[I].EndVal > Merged[M].EndVal then
Merged[M].EndVal := Ranges[I].EndVal;
end;
end;
{ Output }
for I := 1 to M do
writeln('(', Merged[I].StartVal, ', ', Merged[I].EndVal, ')');
end.
(*
run:
(121, 447)
(488, 489)
*)