Cod sursa(job #2614382)

Utilizator DunareanuDinu Dunareanu Dunareanu Data 11 mai 2020 17:51:05
Problema Subsir crescator maximal Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>

FILE *fin , *fout;

int v[100000],poz[100000],rez[100000];

int cb(int st,int dr,int x) {
    int mij,p=-1;
    while(st<=dr) {
        mij=(st+dr)/2;
        if(rez[mij]<x) {
            st=mij+1;
        }
        else {
            p=mij;
            dr=mij-1;
        }
    }
    return p;
}

int main() {
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");

    int i,n,nr,p,k;

    fscanf(fin,"%d",&n);
    for(i=0;i<n;i++) {
        fscanf(fin,"%d",&v[i]);
    }

    nr=0;
    rez[0]=v[0];
    poz[0]=0;
    for(i=1;i<n;i++) {
        p=-1;
        p=cb(0,nr,v[i]);
        if(p==-1) {
            rez[nr]=v[i];
            nr++;
            poz[i]=nr;
        }
        else {
            poz[i]=p;
            rez[p]=v[i];
        }
    }

    fprintf(fout,"%d\n",nr+1);
    k=0;
    for(i=n-1;i>=0;i--) {
        if(poz[i]==nr) {
            rez[k]=v[i];
            k++;
            nr--;
        }
    }
    for(i=k-1;i>=0;i--) {
        fprintf(fout,"%d ",rez[i]);
    }
    fprintf(fout,"\n");

    fclose(fin);
    fclose(fout);
    return 0;
}