Cod sursa(job #2347961)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 februarie 2019 11:38:12
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 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 b)
{
    char e[100];
    int j;
    if(!b)
        r[l++]=48;
    for(j=0;b;b/=10,j++)
        e[j]=b%10+48;
    for(j--;j>=0;j--)
        r[l++]=e[j];
}
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);
}