Pagini recente » Istoria paginii runda/clasele_5_6/clasament | Cod sursa (job #2160604) | Cod sursa (job #1866513) | Cod sursa (job #2140404) | Cod sursa (job #603831)
Cod sursa(job #603831)
#include <fstream>
#include <cstring>
#define X1 100001
using namespace std;
ifstream in;
ofstream out;
int v[X1],d[X1],q[X1];
inline int BS(int x,int L,int R)
{
if(L<=R)
{
int M=L+(R-L)/2;
if(x<q[M]) return BS(x,M+1,R);
else return BS(x,L,M-1);
}
else
return L;
}
int main()
{
int N,pos;
in.open("scmax.in");
in>>N;
for(int i=1;i<=N;++i) in>>v[i];
in.close();
memset(d,0,sizeof(d));
memset(q,0,sizeof(q));
d[N]=1;
q[++q[0]]=v[N];
for(int i=N-1;i>0;--i)
if(q[q[0]]>v[i])
{
q[++q[0]]=v[i];
d[i]=q[0];
}
else
{
pos=BS(v[i],1,q[0]);
d[i]=d[pos];
q[pos]=v[i];
}
out.open("scmax.out");
pos=N;
for(int i=1;i<N;++i)
if(d[pos]<d[i]) pos=i;
out<<d[pos]<<'\n';
pos=d[pos];
int x=-1;
for(int i=1;i<=N;++i)
if(d[i]==pos&&x<v[i])
{
x=v[i];
pos--;
out<<v[i]<<' ';
if(!pos) break;
}
out<<'\n';
out.close();
return 0;
}