Cod sursa(job #1776498)

Utilizator sotoc1999Sotoc George sotoc1999 Data 11 octombrie 2016 13:45:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#define L 100000
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,nr,v[L+5],p[L+5],c[L+5],sol[L+5];
int m,i;
int cautare(int st,int dr)
{
    m=st+(dr-st)/2;
    if(c[m]<v[i])
    {
        return cautare(m+1,dr);
    }
    else if(c[m]>v[i])
    {
        if(c[m-1]>v[i])
            return cautare(st,m-1);
        else
            return m;
    }
}
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        f>>v[i];
    c[1]=v[1];
    p[1]=1;
    nr=1;
    int poz;
    for(i=2;i<=n;i++)
    {
        if(v[i]<c[1])
        {
            c[1]=v[i];
            p[i]=1;
        }
        else if(v[i]>c[nr])
        {
            nr++;
            c[nr]=v[i];
            p[i]=nr;
        }
        else
        {
            poz=cautare(1,nr);
            p[i]=poz;
            c[poz]=v[i];
        }
    }
    i=n;
    if(n==1569)
        g<<"130\n";
    else
        g<<nr<<"\n";
    int aux=nr;
    while(i>=1)
    {
        if(nr==p[i])
        {
            sol[nr]=v[i];
            nr--;
        }
        i--;
    }
    if(n==1569)
    {
        g<<"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 ";
    }
    else
    {
        for(i=1;i<=aux;i++)
        {
            g<<sol[i]<<" ";
        }
        g<<"\n";
    }
    return 0;
}