Cod sursa(job #748937)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 15 mai 2012 10:40:16
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
using namespace std;
int i, primu, p[100001], q[100001], z, j, a[100001], n;
bool ok;
void cb(int st, int dr){
    int mij=(st+dr)/2;
    if ((a[i]<=q[mij])&&(a[i]>q[mij+1])) {p[z]=mij; q[mij]=a[i];} else
    if (a[i]<q[mij]) cb(mij, dr); else cb(st, mij);
}
int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout); z=1;
    scanf("%d", &n); q[0]=1; scanf("%d", &a[1]); q[1]=a[1]; p[1]=1; p[0]=1;
    for (i=2;i<=n;i++) {
        scanf("%d", &a[i]); z++;
        if (a[i]>q[q[0]]) {p[z]=q[0]+1; q[++q[0]]=a[i];}
            else
        if (a[i]<q[1]) {p[z]=1; q[1]=a[i];}
            else
        if (q[0]<5) {
            for (j=1;j<=n;j++)
            if (a[i]<=q[j]) {
                p[z]=j; q[j-1]=a[i];}
            }
            else cb(1, q[0]);
    } z=1;
    if (q[1]==a[1]) primu=1; else primu=2;
    printf("%d\n", q[0]); for (i=primu;i<=n;i++) if (p[i]==z) {z++; printf("%d ", a[i]);}
    return 0;
}