import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Solution test=new Solution();//[[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
//[[0,2,3],[2,5,3]]
//[[1,2,1],[1,2,2],[1,2,3]]
//[[0,3,3],[1,5,3],[2,4,3],[3,7,3]]
int[][] input=new int[][]{{0,3,3},{1,5,3},{2,4,3},{3,7,3}};
System.out.println(test.getSkyline(input));
}
class Point{
int x;
int h;
public Point(int x,int h){
this.x=x;
this.h=h;
}
}
public List<List<Integer>> getSkyline(int[][] buildings) {
ArrayList<Point> lines=new ArrayList<>();
if(buildings==null||buildings.length==0){
return null;
}
int[] line=buildings[0];
lines.add(new Point(line[0],line[2]));
lines.add(new Point(line[1],0));
Point p1,p2;
for(int i=1;i< buildings.length;i++){
line=buildings[i];
int curLen=lines.size();
int j=0;
while(j<lines.size()){
while(j<lines.size()&&lines.get(j).x<line[0]){
j++;
}
if(j<lines.size()){//当前j的点小于或等于line[0]
p2=lines.get(j);
if(line[0]<p2.x){//line的左端点小于j的x
p1=lines.get(j-1);
if(line[2]>p1.h){//line的高度大
lines.add(j,new Point(line[0],line[2]));
if(line[1]<p2.x){
lines.add(j+1,new Point(line[1],p1.h));
j=lines.size()+1;
}else if(line[1]>p2.x){
line[0]=p2.x;
}else{
j=lines.size()+1;
}
}else{//line的高度小于等于
if(line[1]>p2.x){
line[0]=p2.x;
}else{
j=lines.size()+1;
}
}
}else{//line的左端点等于j的x
int tempH=p2.h;
if(p2.h<line[2]){//line的高度高
p2.h=line[2];
if(j==lines.size()-1){
lines.add(new Point(line[1],0));
j=lines.size()+1;
}else{
if(line[1]<lines.get(j+1).x){
lines.add(j+1,new Point(line[1],tempH));
j=lines.size()+1;
}else if(line[1]>lines.get(j+1).x){
line[0]=lines.get(j+1).x;
}else{
j=lines.size()+1;
}
}
}else{//line的高度小于等于
if(line[1]<lines.get(j+1).x){
j=lines.size()+1;
}else if(line[1]>lines.get(j+1).x){
line[0]=lines.get(j+1).x;
}else{
j=lines.size()+1;
}
}
}
}
}
if(j==lines.size()){//已到末尾
lines.add(new Point(line[0],line[2]));
lines.add(new Point(line[1],0));
}
for(int k=1;k<lines.size();k++){
if(lines.get(k).h==lines.get(k-1).h){
lines.remove(k);
k--;
}
}
}
List<List<Integer>> ans= new ArrayList<>();
for(int i=0;i<lines.size();i++){
List<Integer> list=new ArrayList<>();
list.add(lines.get(i).x);
list.add(lines.get(i).h);
ans.add(list);
}
return ans;
}
}