Cod sursa(job #1877553)

Utilizator Coroian_DavidCoroian David Coroian_David Data 13 februarie 2017 15:46:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int crChar = 4096;

const int buffSize = 4096;

char buff[4100];

bool isDigit(char c)
{
    if(c >= '0' && c <= '9')
        return 1;

    return 0;
}

void refillBuff()
{
    crChar = 0;

    fread(buff, 1, buffSize, f);
}

char getCr()
{
    if(crChar == buffSize)
        refillBuff();

    return buff[crChar ++];
}

int getNr()
{
    char c = getCr();
    int nr = 0, sign = 1;

    while(isDigit(c) == 0 && c != '-')
        c = getCr();

    while(c == '-')
    {
        sign = -1;

        c = getCr();
    }

    while(isDigit(c) == 1)
    {
        nr = nr * 10 + c - '0';

        c = getCr();
    }

    return nr * sign;
}

int n;

int v[100001];

void readFile()
{
    f = fopen("scmax.in", "r");

    n = getNr();

    int i;
    for(i = 1; i <= n; i ++)
    {
        v[i] = getNr();
    }

    fclose(f);
}

int dp[100001];

int k;

int urm[100001];
int lst[100001];
int idx[100001];

int mx, pozx;

int cautBin(int n)
{
    int i = 0;
    int pas = 1 << 16;

    while(pas != 0)
    {
        if(i + pas <= k && v[idx[i + pas]] < n)
            i += pas;

        pas /= 2;
    }

    return i;
}

void solve()
{
    int i;
    int poz;

    k = 1;

    idx[1] = 1;
    dp[1] = 1;

    for(i = 2; i <= n; i ++)
    {
        poz = cautBin(v[i]);

        urm[i] = idx[poz];
        dp[i] = poz + 1;

        idx[poz + 1] = i;

        if(k < poz + 1)
            k = poz + 1;

        if(dp[i] > mx)
        {
            mx = dp[i];
            pozx = i;
        }
    }
}

void afisare(int i)
{
    if(urm[i] != 0)
        afisare(urm[i]);

    fprintf(g, "%d ", v[i]);
}

void printFile()
{
    g = fopen("scmax.out", "w");

    fprintf(g, "%d\n", mx);

    afisare(pozx);

    fprintf(g, "\n");

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}