Cod sursa(job #1344547)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 16 februarie 2015 20:08:00
Problema Subsir crescator maximal Scor 55
Compilator c Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <stdlib.h>
int v[100000],q[100000],p[100000],v1[100000];
int main(){
    FILE*fi,*fout;
    int i,n,m,j,x,st,dr,mij,nr,z;
    fi=fopen("scmax.in" ,"r");
    fout=fopen("scmax.out" ,"w");
    fscanf(fi,"%d" ,&n);
    m=x=0;
    for(i=0;i<n;i++){
        fscanf(fi,"%d" ,&v[i]);
        if(m==0){
            q[m++]=v[i];
            p[x++]=m-1;
        }
        else
            if(q[m-1]<v[i]){
                q[m++]=v[i];
                p[x++]=m-1;
            }
            else
                if(q[0]>v[i]){
                      q[0]=v[i];
                      p[x++]=0;
                }
                else{
                    st=0;
                    dr=m;
                    while(dr-st>1){
                        mij=(st+dr)/2;
                        if(q[mij]>v[i])
                            dr=mij;
                        else
                            st=mij;
                    }
                    while(q[st]<=v[i])
                              st++;
                    q[st]=v[i];
                    p[x++]=i;
                }
    }
    fprintf(fout,"%d\n" ,m);
    nr=m-1;
    z=0;
    for(j=x-1;j>=0;j--)
        if(p[j]==nr){
            v1[z++]=v[j];
            nr--;
        }
    for(i=z-1;i>=0;i--)
        fprintf(fout,"%d " ,v1[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}