#pragma once
#include<algorithm>
#include<utility>
#include<vector>usingnamespacestd;// LIS の index を返すtemplate<typenameT>vector<int>longest_increasing_sequence(constvector<T>&a){intN=a.size();vector<pair<T,int>>dp;vector<int>p(N,-1);for(inti=0;i<N;i++){autoit=lower_bound(begin(dp),end(dp),make_pair(a[i],-i));if(it!=begin(dp))p[i]=-prev(it)->second;if(it==end(dp)){dp.emplace_back(a[i],-i);}else{*it=make_pair(a[i],-i);}}vector<int>res;for(inti=-dp.back().second;i!=-1;i=p[i])res.push_back(i);reverse(begin(res),end(res));returnres;}
#line 2 "dp/longest-increasing-sequence.hpp"
#include<algorithm>
#include<utility>
#include<vector>usingnamespacestd;// LIS の index を返すtemplate<typenameT>vector<int>longest_increasing_sequence(constvector<T>&a){intN=a.size();vector<pair<T,int>>dp;vector<int>p(N,-1);for(inti=0;i<N;i++){autoit=lower_bound(begin(dp),end(dp),make_pair(a[i],-i));if(it!=begin(dp))p[i]=-prev(it)->second;if(it==end(dp)){dp.emplace_back(a[i],-i);}else{*it=make_pair(a[i],-i);}}vector<int>res;for(inti=-dp.back().second;i!=-1;i=p[i])res.push_back(i);reverse(begin(res),end(res));returnres;}