Pagini recente » Cod sursa (job #1663180) | Cod sursa (job #2835656) | Cod sursa (job #1498447) | Cod sursa (job #1076537) | Cod sursa (job #2158182)
#include <iostream>
#include <cstdio>
using namespace std;
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");
int a[100000], t[100000], ind[100000], last[100000];
int cauta(int x,int k)
{
int st=0,dr=k,mij;
while(st<=dr)
{
mij=st+(dr-st)/2;
if(last[mij]==x)return mij;
if(last[mij]<x)st=mij+1;
else dr=mij-1;
}
return dr+1;
}
void afish(int i)
{
if(t[i]==-1)
{
fprintf(fout,"%d ",a[i]);
return;
}
afish(t[i]);
fprintf(fout,"%d ",a[i]);
}
int main()
{
int n,k=0;
fscanf(fin,"%d",&n);
for(int i=0;i<n;i++)
fscanf(fin,"%d",&a[i]);
last[0]=a[0];
ind[0]=0;
t[0]=-1;
for(int i=1;i<n;i++)
{
if(a[i]>last[k])
{
k++;
last[k]=a[i];
ind[k]=i;
t[i]=ind[k-1];
}
else
{
int dr=cauta(a[i],k);
if(last[dr]<a[i])
dr++;
last[dr]=a[i];
t[i]=t[ind[dr]];
ind[dr]=i;
}
}
fprintf(fout,"%d\n",k+1);
afish(ind[k]);
for(int i=0;i<n;i++)
cout<<t[i]<<" ";
return 0;
}