Pagini recente » Cod sursa (job #667539) | Cod sursa (job #583837) | Cod sursa (job #676200) | Cod sursa (job #1369594) | Cod sursa (job #2280012)
#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){
mij = (st+dr)/2;
if(st == dr)
return mij;
if(e[mij] == x)
return mij;
if(e[mij] > x)
dr = mij - 1;
if(e[mij] < x)
st = mij + 1;
}
return st;
}
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;
}