Cod sursa(job #804022)

Utilizator andunhillMacarescu Sebastian andunhill Data 28 octombrie 2012 18:31:50
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;

clock_t start=clock();

FILE *f = fopen("scmax.in", "r");
FILE *g = fopen("scmax.out", "w");

int N, K;
int A[100009];
int v[100009];
int res[100009];

int bst[100009];
int aib[100009];

char BUFF[8192];
char *ptr = BUFF;

void read(int &a)
{   a = 0;
    if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
    while(*ptr < '0' || *ptr > '9')
    {   ptr++;
        if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
    }
    while(*ptr >= '0' && *ptr <= '9')
    {   a = a * 10 + *ptr - '0';
        ptr++;
        if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
    }
}

int query(int idx)
{   int ans = 0;
    while(idx)
    {   if(bst[ans] < bst[aib[idx]])
            ans = aib[idx];
        idx -= (idx & -idx);
    }
    return ans;
}

void update(int idx, int i)
{   while(idx <= N)
    {   if(bst[aib[idx]] < bst[i])
            aib[idx] = i;
        idx += (idx & -idx);
    }
}

void write(int ind)
{   if(ind == 0) return;
    write(v[ind]);
    fprintf(g, "%d ", res[ind]);
}

int main()
{   int i, j;
    int ans = 0;

    read(N);
    for(i = 1; i <= N; i++)
    {   read(A[i]);
        res[i] = v[i] = A[i];
    }
    sort(v + 1, v + N + 1);
    for(i = 2, K = 1; i <= N; i++)      //elimin duplicatele
        if(v[i] != v[i - 1])
            v[++K] = v[i];

    for(i = 1; i <= N; i++)
        A[i] = lower_bound(v + 1, v + K + 1, A[i]) - v;

    for(i = 1; i <= N; i++)
    {   j = query(A[i] - 1);
        bst[i] = bst[j] + 1;
        v[i] = j;
        if(bst[ans] < bst[i]) ans = i;
        update(A[i], i);
    }

    fprintf(g, "%d\n", bst[ans]);
    write(ans);

    cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';
    fclose(f);
    fclose(g);
    return 0;
}