class Solution {
public:
int ceilindex(vector<int> arr,int l,int r,int val){
while(r-l>1){
int mid=l+(r-l)/2;
if(arr[mid]>=val)
r=mid;
else
l=mid;
}
return r;
}
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0) return 0;
vector<int> temp;
temp.push_back(nums[0]);
for(int i=1;i<nums.size();i++){
if(nums[i]<temp[0])
temp[0]=nums[i];
else if(nums[i]>temp[temp.size()-1])
temp.push_back(nums[i]);
else
temp[ceilindex(temp,-1,temp.size()-1,nums[i])]=nums[i];
}
return temp.size();
}
};