Cod sursa(job #609519)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 21 august 2011 21:07:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n,i,x[100001],m[100001],p[100001],l,j,x2[100001],k,maxim;

int cautb(int v) {
    int p,u,b;
    p=0;u=l;b=(p+u)/2;
    while (p<=u) {
        if (x[m[b]]<x[v] && x[m[b+1]]>=x[v]) return b;
        else if(x[m[b+1]]<x[v]) {p=b+1;b=(p+u)/2;}
           else {u=b-1;b=(p+u)/2;}
    }
    return l;
}

void afis(int k) {
    if (p[k]) afis(p[k]);
    g << x[k] << ' ';
}

int main() {
    f >> n;
    for (i=1;i<=n;i++) f >> x[i];
    l=0;
    for (i=1;i<=n;i++) {
        j=cautb(i);
        p[i]=m[j];
        if (j==l || x[i]<x[m[j+1]]) {
            m[j+1]=i;
            l=max(l,j+1);
            x2[i]=j+1;
            if (maxim<x2[i]) {maxim=x2[i];k=i;}
        }
    }
    g << maxim << '\n';
    afis(k);
    g << '\n';
    f.close();g.close();
    return 0;
}