Cod sursa(job #1659117)

Utilizator Andrei501Clicinschi Andrei Andrei501 Data 21 martie 2016 23:39:25
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <stdlib.h>

int v[100001],p[100001],q[100001],S[100001];

int main()
{
    FILE *fin,*fout;
    fin=fopen ("scmax.in","r");
    fout=fopen ("scmax.out","w");

    int N,i,max=1,inf,sup,mid,pos;

    fscanf (fin,"%d",&N);
    fscanf (fin,"%d",&v[1]);
    p[1]=1;
    q[1]=v[1];

    for (i=2; i<=N; i++)
    {
        fscanf (fin,"%d",&v[i]);
        inf=1;
        sup=max;
        pos=0;
        while (inf<=sup)
        {
            mid=(inf+sup)/2;
            if (q[mid]<v[i])
            {
                inf=mid+1;
                pos=mid;
            }
            else if (q[mid]>v[i])
            {
                sup=mid-1;
            }
            else if (q[mid]==v[i])
            {
                inf=sup+1;
                pos=mid-1;
            }
        }
        if (pos==0)
        {
            p[i]=1;
            q[1]=v[i];
        }
        else
        {
            p[i]=pos+1;
            q[pos+1]=v[i];
            if (pos==max)
            {
                max++;
            }
        }
    }
    int m=max;
    for (i=N; i>=1&&m>0; i--)
    {
        if (p[i]==m)
        {
            S[m--]=v[i];
        }
    }

    fprintf (fout,"%d\n",max);
    for (i=1; i<=max; i++)
    {
        fprintf (fout,"%d ",S[i]);
    }

    fclose (fin);
    fclose (fout);
    return 0;
}