Cod sursa(job #2236718)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 30 august 2018 13:08:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <vector>
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");

int v[Nmax],index[Nmax],pred[Nmax];
int size,n;

void citire()
{
    fscanf(f,"%d",&n);
    for(int i=1;i<=n;i++){
        fscanf(f,"%d",&v[i]);
    }
}

int cb(int x)
{
    int r=0,pas=1<<20;
    while(pas)
    {
        if(r+pas<=size)
            if(v[index[r+pas]]<x)
                r+=pas;
        pas/=2;
    }
    return r+1;
}

void rezolva()
{
    size = 0;
    for(int i=1;i<=n;i++)
    {
        if(v[index[size]]<v[i])
        {
            pred[i]=index[size];
            index[++size]=i;
        }
        else
        {
            int poz = cb(v[i]);
            pred[i] = index[poz-1];
            index[poz] = i;
        }
    }
}

int main()
{
    citire();
    rezolva();
    fprintf(g,"%d\n",size);
    vector<int> ans;
    int x=index[size];
    while(x)
    {
        ans.push_back(v[x]);
        x=pred[x];
    }
    reverse(ans.begin(),ans.end());
    for(auto it: ans)
        fprintf(g,"%d ",it);
    return 0;
}