Cod sursa(job #1339157)

Utilizator Alexandra_MMihaila Alexandra Alexandra_M Data 10 februarie 2015 18:42:31
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
/*
#include <fstream>
#define dmax 100005
#define IN "scmax.in"
#define OUT "scmax.out"

using namespace std;
ifstream fin (IN);
ofstream fout (OUT);

int n;
long long lg[dmax], urm[dmax], v[dmax];

void read();
void rez();
void write();

int main()
{
    read();
    rez();
    write();
    return 0;
}
void read()
{
    fin>>n;
    for (int i=1; i<=n; ++i)
        fin>>v[i];
}
void rez()
{
    lg[n]=1;
    urm[n]=0;
    for (int i=n-1; i>0; --i)
    {
        long long maxx=1;
        int pozmax=0;
        for (int j=i+1; j<=n; ++j)
            if (v[i]<v[j])
                if (maxx<1+lg[j])
                {
                    maxx=1+lg[j];
                    pozmax=j;
                }
        lg[i]=maxx;
        urm[i]=pozmax;
    }
}
void write()
{
    long long maxx=lg[1];
    int pozmax=1;
    for (int i=2; i<=n; ++i)
        if (maxx<lg[i])
        {
            maxx=lg[i];
            pozmax=i;
        }
    fout<<maxx<<'\n';
    for (int i=pozmax; i!=0; i=urm[i])
        fout<<v[i]<<' ';
    fout.close();
}
*/
#include <cstdio>
#define dmax 100005
#define IN "scmax.in","r"
#define OUT "scmax.out","w"

using namespace std;
//ifstream fin (IN);
//ofstream fout (OUT);
FILE*fin=fopen(IN);
FILE*fout=fopen(OUT);

int n, pozcr=1;
int best[dmax], poz[dmax], v[dmax], sol[dmax];

void read();
void rez();
void write();
int CB(int,int);

int main()
{
    read();
    rez();
    write();
    return 0;
}
void read()
{
    //fin>>n;
    fscanf(fin,"%d",&n);
    for (int i=1; i<=n; ++i)
        //fin>>v[i];
        fscanf(fin,"%d",&v[i]);
}
void rez()
{
    best[1]=v[1];
    poz[1]=1;
    for (int i=2; i<=n; ++i)
        if (v[i]>best[pozcr])
        {
            best[++pozcr]=v[i];
            poz[i]=pozcr;
        }
        else
        {
            poz[i]=CB(i,pozcr);
            best[poz[i]]=v[i];
        }
}
int CB(int i,int m)
{
    int st=1, dr=m, mij;
    while (dr-st>1)
    {
        mij=(st+dr+1)/2;
        if (best[mij]>v[i])
            st=mij;
        else
            dr=mij;
    }
    return st;
}
void write()
{
    //fout<<pozcr<<'\n';
    fprintf(fout,"%d\n",pozcr+1);
    int p=pozcr;
    for (int i=n; i>0; --i)
        if (poz[i]==pozcr)
            sol[pozcr--]=v[i];
    for (int i=1; i<=p; ++i)
        //fout<<sol[i]<<' ';
        fprintf(fout,"%d ",sol[i]);
    //fout.close();
    fclose(fout);
}