Pagini recente » Cod sursa (job #2867386) | Cod sursa (job #382651) | Cod sursa (job #3199741) | Cod sursa (job #1534678) | Cod sursa (job #432428)
Cod sursa(job #432428)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define Nmax 100005
#define Buf 1005
char buff[Buf];
int poz=Buf-1;
int N,a[Nmax],M=1;
int best[Nmax],L[Nmax],prec[Nmax];
int Sol[Nmax];
int caut(int x)
{
int st,dr,last=0,mid;
for(st=0 , dr=M; st<=dr ;)
{
mid = st+(dr-st)/2;
if (x > a[ L[mid] ])
{
st=mid+1;
last = mid;
}
else
dr = mid-1;
}
return last;
}
void solve()
{
best[1]=1;
L[1]=1;
for(int i=2;i<=N;++i)
{
poz = caut(a[i]);
best[i] = poz+1;
prec[i] = L[poz];
if (a[ L[poz+1] ] > a[i])
L[poz+1] = i;
if (M < poz+1)
{
M = poz+1;
L[poz+1] = i;
}
}
for(int i=L[M];i;i=prec[i])
Sol[++Sol[0]]=a[i];
printf("%d\n",M);
for(int i=Sol[0];i;--i)
printf("%d ",Sol[i]);
printf("\n");
}
void read(int &nr)
{
for(; !isdigit(buff[poz]) ;)
if (++poz == Buf)
{
fread(buff,1,Buf,stdin);
poz=0;
}
for(nr=0; isdigit(buff[poz]) ;)
{
nr=nr*10 + buff[poz]-'0';
if (++poz==Buf)
{
fread(buff,1,Buf,stdin);
poz=0;
}
}
}
void cit();
int main()
{
cit();
solve();
return 0;
}
void cit()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
read(N);
for(int i=1;i<=N;++i)
read(a[i]);
}