Pagini recente » Borderou de evaluare (job #2013005) | Cod sursa (job #2606361) | Cod sursa (job #909373) | Cod sursa (job #2348999) | Cod sursa (job #655930)
Cod sursa(job #655930)
#include<fstream>
#define lmax 100002
using namespace std;
ifstream f("scmax.in",fstream::in);
ofstream g("scmax.out",fstream::out);
int n,maxim,k,poz,nr,v[lmax],p[lmax],best[lmax],l[lmax];
void show(int x)
{
if(p[x]>0)
show(p[x]);
g<<v[x]<<" ";
}
int cauta(int x)
{
int st,dr,m;
st=0;
dr=nr;
m=(st+dr)/2;
while(st<=dr)
{
if(v[l[m]]<x && v[l[m+1]]>=x)
return m;
else
if(v[l[m+1]]<x)
{
st=m+1;
m=(st+dr)/2;
}
else
{
dr=m-1;
m=(st+dr)/2;
}
}
return nr;
}
void read()
{
int i;
f>>n;
for(i=1;i<=n;i++)
f>>v[i];
}
void init()
{
nr=1;
best[1]=l[1]=1;
l[0]=0;
}
void solve()
{
int i;
for(i=2;i<=n;i++)
{
poz=cauta(v[i]);
p[i]=l[poz];
best[i]=poz+1;
l[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
}
}
int main()
{
read();
init();
solve();
maxim=0;poz=1;
for(int i=1;i<=n;i++)
if(best[i]>maxim)
maxim=best[i],poz=i;
g<<maxim<<"\n";
show(poz);
f.close();
g.close();
return 0;
}