Pagini recente » Cod sursa (job #1421132) | Cod sursa (job #1152366) | Cod sursa (job #414959) | Cod sursa (job #2829529) | Cod sursa (job #546590)
Cod sursa(job #546590)
#include <cstdio>
using namespace std;
#define NMAX 1000001
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
long long A[NMAX],sol[NMAX],L[NMAX],pre[NMAX],pL[NMAX];
int n,lmx;
void show(int i)
{
if(i==0) return;
show(pre[i]);
fprintf(g,"%d ",A[i]);
}
int binary_search(int x)
{
int lb=1,ub=lmx,mb=(1+lmx)>>1,s=-1;
while(lb<=ub)
{
if(L[mb]<x)
{
s=mb;
lb=mb+1;
}
else
{
ub=mb-1;
}
mb=(ub+lb)>>1;
}
return s;
}
int main()
{
int i,p;
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
fscanf(f,"%lld",&A[i]);
sol[1]=1;
lmx=1;
pL[1]=1;
L[1]=A[1];
for(i=2;i<=n;i++)
{
if(L[lmx]>=A[i]&&A[i]>A[pre[pL[lmx]]])
{
L[lmx]=A[i];
pre[i]=pre[pL[lmx]];
pL[lmx]=i;
sol[i]=lmx;
}
else if(A[i]>L[lmx])
{
++lmx;
pre[i]=pL[lmx-1];
sol[i]=lmx;
L[lmx]=A[i];
pL[lmx]=i;
}
else
{
p=binary_search(A[i]);
if(p==-1)
{
pre[i]=0;
sol[i]=1;
}
else
{
pre[i]=pL[p];
sol[i]=p+1;
}
}
}
fprintf(g,"%d\n",lmx);
show(pL[lmx]);
return 0;
}