Cod sursa(job #1557151)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 decembrie 2015 20:45:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<fstream>
#include<stack>
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

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

int V[100005], AINT[400005], Index[100005], Sol[100005];
int n, maxi;
stack <int> S;

void citire()
{
    f>>n;
    for(int i=1; i<=n; i++)
        f>>V[i];
}

void Update(int left, int right, int nod, int pos)
{
    int mid = (left + right)/2;

    if(left == right){
        AINT[nod] = Sol[pos];
        return;
    }
    if(pos <= mid)
        Update(left, mid, 2*nod, pos);
    else
        Update(mid + 1, right, 2*nod + 1, pos);

    AINT[nod] = max(AINT[2*nod + 1], AINT[2*nod]);
}

void Query(int st, int fi, int left, int right, int nod)
{
    int mid = (left + right)/2;

    if(st <= left && right <= fi){
        maxi = max(maxi, AINT[nod]);
        return;
    }

    if(st <= mid)
        Query(st, fi, left, mid, 2*nod);
    if(fi >= mid + 1)
        Query(st, fi, mid + 1, right, 2*nod+1);
}

bool Compare(int x, int y)
{
    if(V[x] != V[y])
        return (V[x] < V[y]);
    else
        return x > y;
}

void rez()
{
    int i, imx, poz, val, el;

    for(i=1; i<=n; i++)
        Index[i] = i;

    sort(Index + 1, Index + n + 1, Compare);

    for(i=1; i<=n; i++){
        poz = Index[i];
        val = V[Index[i]];
        maxi = 0;
        Query(1, poz, 1, n, 1);
        Sol[Index[i]] = maxi + 1;
        Update(1, n, 1, Index[i]);
    }

    maxi = 0;
    for(i=1; i<=n; i++){
        if(Sol[i] > maxi){
            imx = i;
            maxi = Sol[i];
        }
    }

    g<<maxi<<"\n";
    S.push(imx);

    for(i = imx-1; i>0; i--){
        if(Sol[i] == (Sol[imx] - 1) && V[i] < V[imx]){
            imx = i;
            S.push(imx);
        }
    }

    while(!S.empty()){
        el = V[S.top()];
        S.pop();
        g<<el<<" ";
    }
    g<<"\n";
}

int main()
{
    citire();
    rez();
    return 0;
}