Skip to content

LIS (nlogn)

cpp
pair<ll,vector<ll>>lis(vector<ll>&a){
  ll n = a.size();

  vector<ll>len;
  vector<ll>insertedAt(n);

  for(ll i=0;i<n;i++){
    if(len.size()==0 || len.back()<a[i]){
      len.push_back(a[i]);
      insertedAt[i] = len.size();
    }else{
      auto it = lower_bound(len.begin(),len.end(),a[i]);
      *it = a[i];
      insertedAt[i] = it-len.begin()+1;
    }
  }

  ll sz = len.size();
  ll idx = max_element(insertedAt.begin(),insertedAt.end())-insertedAt.begin();

  vector<ll>ans;

  while(idx>=0){
    if(sz==insertedAt[idx]){
      ans.push_back(a[idx]);
      sz--;
    }
    idx--;
  }

  reverse(ans.begin(),ans.end());

  return {len.size(),ans};
}