Cod sursa(job #1098022)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 4 februarie 2014 13:09:25
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
int min[100001],nr;//min[i]=pozitia celui mai mic numar ce,
//plasat intr-un subsir, este al i-lea in subsirul respectiv
int p[100001],v[100001],n;
void afis(int i,FILE *fout){
    if(p[i]>0){
        afis(p[i],fout);
    }
    fprintf(fout,"%d ",v[i]);
}
int caut(int a){
    int i,pas;
    i=0;
    for(pas=1<<16;pas>0;pas>>=1){
        if((i+pas<=nr)&&(v[min[i+pas]]<a)){
            i+=pas;
        }
    }
    return i;
}
int main(){
    int i,poz,end;
    FILE *fin,*fout;
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(fin,"%d",&v[i]);
    }
    nr=1;
    end=1;
    min[1]=1;
    for(i=2;i<=n;i++){
        poz=caut(v[i]);//aflu cea mai mare pozitie pentru care v[min[poz]]<v[i]
        p[i]=min[poz];//pozitia numarului dupa care plasam v[i] in subsirul crescator maximal
        min[poz+1]=i;//actualizam pozitia minimul
        if(nr<poz+1){
            nr=poz+1;//lungimea maxima a unui subsir
            end=i;//pentru a afisa la final subsirul crescator maximal
        }
    }
    fprintf(fout,"%d\n",nr);
    afis(end,fout);
    fprintf(fout,"\n");
    fclose(fin);
    fclose(fout);
    return 0;
}