Cod sursa(job #1530036)

Utilizator SckiffoMarius Jucan Sckiffo Data 21 noiembrie 2015 11:45:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<stdio.h>
long n,i,x[100001],poz[100001],vm[100001],dad[100001],st,dr,mi,lmax;
void afis(long pc);
int main()
{
    freopen("scmax.in","rt",stdin);
    freopen("scmax.out","wt",stdout);
    scanf("%ld",&n);
    for(i=1;i<=n;i++)scanf("%ld",&x[i]);
    lmax=1;poz[1]=1;vm[1]=x[1];
    for(i=2;i<=n;i++)
    { if(x[i]>vm[lmax])
      { lmax++;poz[lmax]=i;vm[lmax]=x[i];dad[i]=poz[lmax-1];continue;}
      if(x[i]<=vm[1])
      { poz[1]=i;vm[1]=x[i];dad[i]=0;continue;}
      st=1;dr=lmax;
      while(dr-st>1)
      { mi=(st+dr)/2;
        if(vm[mi]<x[i])st=mi;
        else dr=mi;
      }
      if(x[i]<vm[dr])
      { poz[dr]=i;vm[dr]=x[i];dad[i]=poz[st];}
    }
    printf("%ld\n",lmax);
    afis(poz[lmax]);
    fcloseall();
    return 0;
}
void afis(long pc)
{
    if(!pc)return;
    afis(dad[pc]);
    printf("%ld ",x[pc]);
}