Cod sursa(job #750467)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 22 mai 2012 10:32:31
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
using namespace std;
int i, a[100001], p[100001], q[100001], n, m;
int cb(int x, int st, int dr){
    int mij, pz;
    pz=0;
    while ((st<=dr)&&(pz==0)) {
        mij=(st+dr)/2;
        if (q[mij]==x) pz=mij; else
        if (q[mij]<x) st=mij+1; else dr=mij-1;
    }
    if (pz==0) return st; else return pz;
}
void scrie(int poz, int x, int ult){
    if (poz>0) {
    if ((p[poz]==x)&&(ult>a[poz])) {
        scrie(poz-1, x-1, a[poz]);
        printf("%d ", a[poz]);
    }
        else scrie(poz-1, x, ult);
    }
}
int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d", &n);
    for (i=1;i<=n;i++) {scanf("%d", &a[i]); p[i]=0; q[i]=0;}
    p[1]=1; q[0]=1; q[1]=a[1];
    for (i=2;i<=n;i++) {
        m=cb(a[i], 1, q[0]);
        if (m>q[0]) {q[0]++; p[i]=q[0]; q[q[0]]=a[i];} else {q[m]=a[i]; p[i]=m;}
    }
    printf("%d\n", q[0]);
    scrie(n, q[0], 1000000000);
    return 0;
}