Pagini recente » Cod sursa (job #2652275) | Cod sursa (job #2680628) | Cod sursa (job #2121070) | Cod sursa (job #2653644) | Cod sursa (job #2520456)
#include <iostream>
#include <fstream>
#define INF 2000000999
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int dp[100005];
int pdp[100005];///pozitia acelui element din dp
int v[100005];
int pv[100005];///peste ce element din vector este pus
int n,i,lgmax;
int st,dr,mijl;
stack <int> a;
int main()
{
fin>>n;
for(i=1;i<=n+1;i++){
dp[i]=INF;
}
for(i=1;i<=n;i++){
fin>>v[i];
st=0;
dr=n+1;
while(st<=dr){
mijl=(st+dr)/2;
if(dp[mijl]<v[i] && dp[mijl+1]>=v[i]){
dp[mijl+1]=v[i];
pdp[mijl+1]=i;
pv[i]=pdp[mijl];
break;
}
else if(dp[mijl]>=v[i]){
dr=mijl-1;
}
else{
st=mijl+1;
}
}
}
for(i=1;i<=n+1;i++){
if(dp[i]==INF){
lgmax=i-1;
break;
}
}
fout<<lgmax<<'\n';
i=pdp[lgmax];
while(i!=0){
a.push(v[i]);
i=pv[i];
}
while(!a.empty()){
fout<<a.top()<<" ";
a.pop();
}
return 0;
}