Cod sursa(job #1984612)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 25 mai 2017 15:19:12
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <stdio.h>
using namespace std;
int v[100001],sol[100001],poz[100001],f[100001];
int main(){

    FILE *fin,*fout;
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");

    int n,i,nr,m,l1,l2,pozz,x;

    fscanf(fin,"%d",&n);

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

    nr=1;
    sol[1]=v[1];
    poz[1]=1;

    for(i=2;i<=n;i++){
        if(v[i]>sol[nr]){
            nr++;
            sol[nr]=v[i];
            poz[i]=nr;
        }
        else{
            l1=1;
            l2=nr;
            pozz=1;
            while(l1<=l2){
                m=(l1+l2)/2;
                if(sol[m]<v[i])
                    l1=m+1;
                else{
                    l2=m-1;
                    pozz=m;
                }
            }
            sol[pozz]=v[i];
            poz[i]=pozz;
        }
    }
    fprintf(fout,"%d\n",nr);

    x=nr;
    for(i=n;i>=1;i--)
        if(f[poz[i]]==0){
            sol[x]=v[i];
            x--;
            f[poz[i]]=1;
        }
    for(i=1;i<=nr;i++)
        fprintf(fout,"%d ",sol[i]);

    fclose(fin);
    fclose(fout);

    return 0;
}