Program Segments; Const TaskID='g'; InFile=TaskID+'.in'; OutFile=TaskID+'.out'; Const MaxN=3002; { Ограничение на N } MaxRes=2*MaxN; { Ограничение на число точек в ответе } Infinity=MaxLongInt; { "Бесконечная" координата } Type TSegment=Record Left,Right:LongInt; End; Var N:LongInt; { Входные } Segment:Array[1..MaxN]Of TSegment; { данные } Res:LongInt; { Число точек в ответе } Point:Array[1..MaxRes]Of LongInt; { Точки ответа } Procedure Load; Var I:LongInt; Begin Assign(Input,InFile); ReSet(Input); Read(N); For I:=1 To N Do With Segment[I] Do Read(Left,Right); Close(Input); End; Function Less(Const A,B:TSegment):Boolean; { Сравнение двух отрезков по правому краю, а при равенстве правого - по убыванию левого } Begin If A.RightB.Right Then Less:=False Else Less:=A.Left>B.Left; End; Procedure QuickSort(Start,Finish:LongInt); { "Быстрая" сортировка } Var PLeft,PRight:LongInt; Separator,Temp:TSegment; Begin PLeft:=Start; PRight:=Finish; Separator:=Segment[(Start+Finish) Div 2]; While PLeft<=PRight Do Begin While Less(Segment[PLeft],Separator) Do Inc(PLeft); While Less(Separator,Segment[PRight]) Do Dec(PRight); If PLeft<=PRight Then Begin Temp:=Segment[PLeft]; Segment[PLeft]:=Segment[PRight]; Segment[PRight]:=Temp; Inc(PLeft); Dec(PRight); End; End; If Start1 Then Write(' '); Write(Point[I]); End; WriteLn; Close(Output); End; Begin Load; SortSegments; Solve; Save; End.