Cod sursa(job #804002)

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

clock_t start=clock();

ifstream f("scmax.in");
ofstream g("scmax.out");

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

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

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]);
    g<<res[ind]<<" ";
}

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

    f>>N;
    for(i = 1; i <= N; i++)
    {   f>>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);
    }

    g<<bst[ans]<<'\n';
    write(ans);

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