Cod sursa(job #717255)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 19 martie 2012 19:30:50
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
int n,a[100001],l[100001],best[100001],p[100001],nr;
int caut(int x){
    int st=0,sf=nr,m=(st+sf)/2;
    while (st<=sf){
        if (a[l[m]]<x && a[l[m+1]]>=x)
         return m;
        if (a[l[m+1]]<x){
            st=m+1;
            m=(st+sf)/2;
        }
        else{
            sf=m-1;
            m=(st+sf)/2;
        }
    }
    return nr;
}
void afis(int x){
    if (p[x])
     afis(p[x]);
    printf("%d ",a[x]);
}
int main(){
	
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
	
    scanf("%d",&n);
    int i,poz,max,pm;
    for (i=1;i<=n;i++)
        scanf("%d",&a[i]);
    l[1]=best[1]=1;
    nr=1;
    for(i=2;i<=n;i++){
        poz=caut(a[i]);
        best[i]=poz+1;
        p[i]=l[poz];
        l[poz+1]=i;
		printf(" %d %d\n",l[poz+1],poz+1);
        if (poz+1>nr)
		nr=poz+1;
    }
    max=best[1];
    pm=1;
    for (i=2;i<=n;i++)
		if (best[i]>max){
		max=best[i];
		pm=i;
	}
    printf("%d\n",max);
    afis(pm);
    printf("\n");
    return 0;
}