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