Pagini recente » Cod sursa (job #935715) | Cod sursa (job #216063) | Cod sursa (job #2064308) | Cod sursa (job #1557801) | Cod sursa (job #2280059)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int a[100005], p[100005];
vector <int> e;
int n;
int cautBin(int x){
int st=1, dr=e.size()-1;
int mij;
while(st<=dr){
if(st==dr)
return st;
mij = (st+dr)/2;
if(e[mij] < x)
st = mij + 1;
else
dr = mij;
}
return 0;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d\n", &n);
e.push_back(0);
for(int i=0;i<n;++i){
scanf("%d", &a[i]);
if(e.back() < a[i])
e.push_back(a[i]), p[i] = e.size() - 1;
else{
int poz = cautBin(a[i]);
e[poz] = a[i];
p[i] = poz;
}
}
int l = e.size() - 1;
int pc = n-1;
vector <int> sol;
cout<<l<<"\n";
for(int i=0;i<l;++i){
for(int j=pc;j>=0;--j){
if(p[j] == l-i){
sol.push_back(a[j]);
pc = j-1;
break;
}
}
}
//for(int i=0;i<n;++i)
//cout<<p[i]<<" ";
//cout<<"\n";
for(int i=l-1;i>=0;--i)
cout<<sol[i]<<" ";
return 0;
}