Cod sursa(job #750497)

Utilizator StrajanStrajan Sebastian Ioan Strajan Data 22 mai 2012 13:26:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<fstream>
using namespace std;
#define NMAX 100005
int v[NMAX], b[NMAX], pre[NMAX], n, maxim = 1;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int search(int x){
    int p = 1, u = maxim, m;
    while (p < u){
        m = (p+u)/2;
        if (v[x] <= v[b[m]]) u = m;
        else p = m+1;
    }
    if (v[b[p]] < v[x]) return 0;
    return p;
}

void scrie(int i){
    if (pre[i]) scrie(pre[i]);
    fout<<v[i]<<" ";
}

int main(){
    int i, poz;
    fin>>n;
    for (i=1; i<=n; ++i) fin>>v[i];
    b[1]=1;
    for (i=2; i<=n; ++i){
        poz = search(i);
        if (poz == 0){
            pre[i] = b[maxim];
            b[++maxim] = i;
        }
        else{
            b[poz] = i;
            pre[i] = b[poz-1];
        }
    }
    fout<<maxim<<endl;
    if (maxim > 1) scrie(pre[b[maxim]]);
    fout<<v[b[maxim]]<<endl;
    return 0;
}