Cod sursa(job #557916)

Utilizator nickyyLal Daniel Emanuel nickyy Data 16 martie 2011 22:53:48
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#define maxn 100005
#define infinit 1<<30
int A[maxn],Q[maxn],P[maxn];
int N,Lg;

    void citire(void)
    {   FILE *fin =fopen("scmax.in","r");
        int i;
        fscanf(fin,"%d",&N);
        for(i=1; i<=N; ++i) fscanf(fin,"%d",A+i);
        fclose(fin);
    }

    int cauta(int x)
    {   int i,step;
        for(step=1; step<Lg; step<<=1);
        for(i=0; step; step>>=1)
            if(i+step<=Lg && Q[i+step]<x)
                i+=step;
        if(Q[i]<x) ++i;
        return i;
    }

    void solve(void)
    {   int i,poz,k;
        for(i=1; i<=N; ++i)
        {   poz=cauta(A[i]);
            Q[poz]=A[i];
            if(poz>Lg) Lg=poz;
            P[i]=poz;
        }
        for(i=Lg,k=N; i; --i)
        {   while(P[k]!=i) --k;
            Q[i]=A[k];
        }
    }

    void scrie(void)
    {   FILE *fout=fopen("scmax.out","w");
        int i;
        fprintf(fout,"%d\n",Lg);
        for(i=1;i<=Lg;++i) fprintf(fout,"%d ",Q[i]);
        fclose(fout);
    }

int main(void)
{   citire();
    solve();
    scrie();
    return 0;
}