Cod sursa(job #1250709)

Utilizator alexutapristavu alexandra maria alexuta Data 28 octombrie 2014 13:56:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int nmax = 100009;
int v[nmax],q[nmax],p[nmax],n,L,sol[nmax];
void citire()
{
    f>>n;
    for(int i = 1 ; i <= n ; i++)
        f>>v[i];
}
int bin_search(int val,int left,int right)
{
    int mij;
    while(left <= right)
    {
        mij = (left+right)/2;
        if(val > q[mij])
            left = mij+1;
        else
            right = mij-1;
    }
    if(left > L){
        q[++L] = val;
        return left;
    }
    else {
        q[left] = val;
        return left;
    }
}
void buildPQ()
{
    q[1] = v[1];
    p[1] = 1;
    L = 1;
    for(int i = 2 ; i <= n ; i++){
        p[i] = bin_search(v[i],1,L);
    }
}

void build_sol()
{
    int i,k = n;
    for(i = L; i ; i--){
        while(p[k] != i) k--;
        sol[i] = v[k];
    }
}

void afis_sol()
{
    g<<L<<"\n";
    for(int i = 1 ; i <= L ; i++)
        g<<sol[i]<<" ";
    g.close();
}

int main()
{
    citire();
    buildPQ();
    build_sol();
    afis_sol();
    return 0;
}