Pagini recente » Cod sursa (job #1106261) | Cod sursa (job #1482895) | Cod sursa (job #710971) | Cod sursa (job #825872) | Cod sursa (job #1947183)
#include <fstream>
#include<vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> best,v,l,pre;
int n,nr;
void afiseaza(int k)
{
if(pre[k]) afiseaza(pre[k]);
g<<v[k]<<' ';
}
int caut_bin(int x)
{
int p=0,u=nr,m=(p+u)/2;
while(p<=u)
{
if(v[l[m]]<x && v[l[m+1]]>=x) return m;
else if(v[l[m+1]]<x){p=m+1; m=(p+u)/2;}
else {u=m-1;m=(p+u)/2;}
}
return nr;
}
int main()
{
f>>n;
best.resize(n+1);
v.resize(n+1);
l.resize(n+1);
pre.resize(n+1);
for(int i=1; i<=n; i++) f>>v[i];
best[1]=l[1]=1;l[0]=0;nr=1;
for(int i=2;i<=n;i++)
{
int pos=caut_bin(v[i]);
best[i]=pos+1;
l[pos+1]=i;
pre[i]=l[pos];
if(pos+1>nr) nr=pos+1;
}
g<<nr<<'\n';
afiseaza(l[nr]);
return 0;
}