import java.util.*;


public class Solution {
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型一维数组 the array
     * @return int整型一维数组
     */
    public int[] LIS (int[] arr) {
        // write code here
//         num记录每个数组能组成的最大序列;temp记录每个长度中最后一个位置的数字;
        int[] nums = new int[arr.length];
        int[] temp = new int[arr.length];
        nums[0] = 1;
        int tempindex = 0;
        temp[tempindex] = arr[0];
        if(arr.length==1) return arr;
        for(int i=1;i<arr.length;i++){
            int left=0,right=tempindex;
            if(arr[i]==temp[tempindex]){
                nums[i]=tempindex+1;
                continue;
            }
            if(arr[i]>temp[tempindex]){
                ++tempindex;
                nums[i]=tempindex+1;
                temp[tempindex]=arr[i];
            }else{
                while(left<=right){
                    int mid = (right+left)/2;
                    if(temp[mid]>arr[i]){
                        right=mid-1;
                    }else{
                        left=mid+1;
                    }
                    
                }
                temp[left]=arr[i];
                nums[i]=left+1;
            }
        }
        int[] res = new int[tempindex+1];
        for(int i=nums.length-1;i>=0;--i){
            if(nums[i]==tempindex+1){
                res[tempindex]=arr[i];
                --tempindex;
            }
        }
        return res;
        
    }
}