Cod sursa(job #1944760)

Utilizator PaulStighiStiegelbauer Paul-Alexandru PaulStighi Data 29 martie 2017 11:18:45
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMax = 100005;
const int oo = 1<<30;

int N,Poz,ND;
int V[NMax],AIB[NMax],Pre[NMax],Index[NMax];

stack <int> S;

void Read()
{
    fin>>N;

    for(int i = 1 ; i <= N ; ++i)
    {
        fin>>V[i];
        Index[i] = i;
    }
}

void Update(int pos,int Val)
{
    for(int i = pos ; i <= N ; i += i & (-i))
        AIB[i] = max(AIB[i],Val);
}

int Query(int pos)
{
    int Max = 0;

    for(int i = pos ; i ; i -= i & (-i))
    {
        Max = max(Max,AIB[i]);
        Poz = i;
    }

    return Max;
}

bool Comp(int A,int B)
{
    if(V[A] == V[B])    return (A > B);
    return (V[A] < V[B]);
}

void Solve()
{
    sort(Index+1,Index+N+1,Comp);

    for(int i = 1 ; i <= N ; ++i)
    {
        cout<<AIB[i]<<" ";

        int Max = Query(i-1);

        Update(i,Max + 1);

        Pre[i] = Poz;
    }

    ND = Query(N);

    for(int i = Poz ; i ; i = Pre[i])
        S.push(V[Index[i]]);
}

void Print()
{
    fout<<ND<<"\n";

    while(!S.empty())
    {
        fout<<S.top()<<" ";
        S.pop();
    }
}

int main()
{
    Read();
    Solve();
    Print();

    fin.close();
    fout.close();
    return 0;
}