Cod sursa(job #1403890)

Utilizator ThomasFMI Suditu Thomas Thomas Data 27 martie 2015 17:15:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <vector>
using namespace std;

#define NMax 100005

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

int n;
int P[NMax],p;
int D[NMax];
int v[NMax];
vector<int> sol;

int bs(int x)
{
    int j,step;
    for(step=1;step<=p;step<<=1);
    for(j=0;step;step>>=1)
        if(j+step <= p && P[j+step] <= x) j+=step;
    return j;
}

int main()
{
    int i,a,poz;

    f>>n;
    for(i=1;i<=n;++i)
    {
        f>>a;
        v[i] = a;
        if(a > P[p])
        {
            P[++p] = a;
            D[i] = p;
        }
        else
        {
            poz = bs(a);
            if(P[poz] != v[i]) ++poz;
            if(a < P[poz]) P[poz] = a;
            D[i] = poz;
        }
    }

    g<<p<<"\n";

    for(i=n;i>=1;--i) if(D[i] == p)
    {
        --p;
        sol.push_back(i);
    }

    for(i=sol.size()-1;i>=0;--i) g<<v[sol[i]]<<" "; g<<"\n";

    f.close();
    g.close();
    return 0;
}