Cod sursa(job #1097350)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 3 februarie 2014 12:39:17
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<iostream>
using namespace std;

ofstream out("scmax.out");
int n,val[100100],v[100100],best[100100],tata[100100],nr,sol,pozfin;

void citire() {

    ifstream in("scmax.in");
    int i;
    in>>n;
    for(i=1;i<=n;i++)
        in>>val[i];
    in.close();

}

int cautbin(int x) {
    int st,dr,mij;
    st=0;
    dr=nr;
    mij=(st+dr)/2;
    while(st<=dr){
        if(val[v[mij]]<x&&val[v[mij+1]]>=x)
            return mij;
        if(val[v[mij]]>x) {
            dr=mij-1;
            mij=(st+dr)/2;
        }
        if(val[v[mij]]<x) {
            st=mij+1;
            mij=(st+dr)/2;
        }
    }
    return nr;
}


void solve() {

    int i,poz;
    nr=1;
    best[1]=1;
    v[1]=1;

    for(i=2;i<=n;i++){
        poz=cautbin(val[i]);
        best[i]=poz+1;
        tata[i]=v[poz];
        if(v[poz+1]==0 || val[best[poz+1]]>val[i])
            v[poz+1]=i;
        if(nr<poz+1)
            nr=poz+1;
        if(sol<best[i]) {
            sol=best[i];
            pozfin=i;
        }
    }

}

void afis(int i) {

    if(tata[i]!=0)
        afis(tata[i]);
    out<<val[i]<<' ';
}

void afisare() {

    out<<sol<<'\n';
    afis(pozfin);
    out.close();

}

int main() {

    citire();
    solve();
    afisare();
    return 0;

}