Cod sursa(job #2349101)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 20 februarie 2019 10:25:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include<cstdio>
#define N 100001
#define M 3000000
int a[N],b[N],p[N],i,j,k,c,m,n,u,v,l,o;
char r[M];
int A()
{
  	int s=0;
  	for(;r[o]<'0'||r[o]>'9';o++);
  	for(;r[o]>='0'&&r[o]<='9';o++)
  		s=s*10+r[o]-'0';
  	return s;
}
void S(int x)
{
    int i,d=x>999999999?10:x>99999999?9:x>9999999?8:x>999999?7:x>99999?6:x>9999?5:x>999?4:x>99?3:x>9?2:1;
    for(i=d-1;i>=0;x/=10,i--)
        r[l+i]=x%10+48;
    l+=d;
}
int main()
{
    freopen("scmax.in","r",stdin),freopen("scmax.out","w",stdout),fread(r,1,M,stdin),n=A();
    for(i=1;i<=n;i++)
	{
		a[i]=A();
        if(a[b[m]]<a[i])
            p[i]=b[m],b[++m]=i;
        for(j=0,k=m;j<k;)
        	a[b[(j+k)/2]]<a[i]?j=(j+k)/2+1:k=(j+k)/2;
        if(a[i]<a[b[j]])
			j?p[i]=b[j-1]:0,b[j]=i;
    }
    for(u=m,v=b[m];u--;v=p[v])
        b[u]=v;
    S(m),r[l++]='\n';
    for(i=0;i<m;i++)
        S(a[b[i]]),r[l++]=' ';
    fwrite(r,1,l,stdout);
}