Cod sursa(job #1424424)

Utilizator UAIC_HreapcaVlasNegrusUAIC Hreapca Vlas Negrus UAIC_HreapcaVlasNegrus Data 24 aprilie 2015 12:52:09
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <deque>
#include <vector>
#include <cstring>
#include <algorithm>
#define step(x) (x & (-x))
using namespace std;

int N, i, A[100010], B[100010], cnt, last, sol, position, DP[100010], prevs[100010];
vector<pair<int,int> > V;
struct pereche
{
    int val;
    int pos;
} AIB[100010];

pereche query(int x)
{
    pereche res;
    res.val = 0;
    res.pos = 0;
    for( ; x; x -= step(x))
        if(AIB[x].val > res.val)
            res = AIB[x];
    return res;
}

void update(int val, int pos, int x)
{
    for(; x <= N; x+=step(x))
        if(AIB[x].val < val)
        {
            AIB[x].val = val;
            AIB[x].pos = pos;
        }
}

void afiseaza(int x)
{
    if(!DP[x])return;
    afiseaza(prevs[x]);
    printf("%d ", A[x]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d", &N);
    for(i = 1; i <= N; i++)
    {
        scanf("%d", &A[i]);
        V.push_back(make_pair(A[i], i));
    }
    sort(V.begin(), V.end());
    last = -1;
    cnt = 0;
    for(vector<pair<int,int> >::iterator it = V.begin(); it != V.end(); it++)
    {
        if(it->first != last)
        {
            last = it->first;
            cnt = cnt + 1;
        }
        B[it->second] = cnt;
    }
    for(i = 1; i <= N; i++)
    {
        pereche act = query(B[i] - 1);
        DP[i] = act.val + 1;
        if(sol < DP[i])
        {
            sol = DP[i];
            position = i;
        }
        prevs[i] = act.pos;
        update(DP[i], i, B[i]);
    }
    printf("%d\n", sol);
    afiseaza(position);
    return 0;
}