Pagini recente » Cod sursa (job #2189906) | Cod sursa (job #401878) | Cod sursa (job #3192366) | Cod sursa (job #40863) | Cod sursa (job #2765975)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int p[100005], t[100005], dp[100005], d;
int n, k, v[100005];
int st, dr, md;
void go(int p){
if(t[p] != -1)
go(t[p]);
fout<<v[p]<<" ";
}
int main (){
fin>>n;
for(int i=1; i<=n; i++)
fin>>v[i];
d=0;
dp[0]=0;
p[0]=-1;
t[0]=-1;
for(int i=1; i<=n; i++){
k=v[i];
st=0; dr=d;
while(st <= dr){
md=(st+dr)/2;
if(k > dp[md])
st=md+1;
else
dr=md-1;
}
if(st == d+1){
d++;
dp[d]=k;
p[d]=i;
t[i]=p[d-1];
}else if(dp[st] > k){
dp[st]=k;
p[st]=i;
t[i]=p[st-1];
}
/**
cout<<d<<" "<<k<<"\n";
for(int i=1; i<=d; i++)
cout<<dp[i]<<" ";
cout<<"\n\n";
**/
}
fout<<d<<"\n";
go(p[d]);
return 0;
}