Cod sursa(job #865363)

Utilizator Mitza444Vidrean Mihai Mitza444 Data 26 ianuarie 2013 13:23:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<cstdio>
using namespace std;
#define MAX 100001
int X[MAX],P[MAX],M[MAX],best[MAX];
int L,n;
void scrie(int poz){
    if(P[poz])
        scrie(P[poz]);
    printf("%d ",X[poz]);
}
int bin(int x){
    int p=0,u=L,m;
    m=(p+u)/2;
    while(p<=u){
        if(X[M[m]]<x && x<=X[M[m+1]])return m;
        else if(x>X[M[m+1]]){p=m+1;m=(p+u)/2;}
        else {u=m-1;m=(p+u)/2;}
    }
    return L;
}
int main(){
    int i,j,poz,mx=0;
    freopen("scmax.in","r",stdin);
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        scanf("%d",&X[i]);
    fclose(stdin);
    L=1;M[0]=0;M[1]=1;
    for(i=2;i<=n;++i){
        poz=bin(X[i]);
        P[i]=M[poz];
        best[i]=poz+1;
        M[poz+1]=i;
        if(poz+1 > L)
            L=poz+1;
    }
    for(i=1;i<=n;++i)
        if(best[i]>mx)
            mx=best[i],poz=i;
    freopen("scmax.out","w",stdout);
    printf("%d\n",mx);
    scrie(poz);
    fclose(stdout);
    return 0;
}