Cod sursa(job #2514582)

Utilizator mirceatlxhaha haha mirceatlx Data 26 decembrie 2019 14:26:39
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;

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

int val[NMAX], temp[NMAX], ls[NMAX], ans[NMAX], maxV, N, k;

int bs(int value, int lg)
{
    int pas = 1 << 20, r = 0;
    while(pas){
        if(r + pas <= lg && temp[r + pas] < value){
            r += pas;
        }
        pas /= 2;
    }
    return r;
}

void Inlocuire(int lg){
    for(int i = 1; i <= lg; i++){
        ans[i] = temp[i];
    }
}

bool CMP(int lg)
{
    for(int i = 1; i <= lg; i++){
        if(ans[i] > temp[i])
            return true;
    }
    return false;
}

bool isPrime(int value){
    if(value <= 1)
        return true;
    int i;
    for(i = 2; i * i < value; i++){
        if(value % i == 0)
            return false;
    }
    if(i * i == value)
        return false;
    return true;
}

void Subsir(){
    int lg = 1;
    maxV = 1;
    temp[1] = val[1];
    ans[1] = val[1];
    ls[1] = 1;
    for(int i = 2; i <= k; i++){
        int answ = bs(val[i],lg);
        if(answ == lg){

            temp[++lg] = val[i];
            maxV = lg;
            //Inlocuire(lg);
        }
        else {
            temp[answ + 1] = val[i];
        }
        ls[i] = answ + 1;
        /*if(answ + 1 == maxV && CMP(lg)){
            Inlocuire(lg);
        }*/
    }
}

int main()
{
    int v;
    fin >> N;
    for(int i = 1; i <= N; i++){
        fin >> v;
        //if(isPrime(v)){
            val[++k] = v;
            //cout << v << " ";
        //}
    }

    Subsir();
    fout << maxV << "\n";
    for(int i = 1; i <= maxV; i++){
        fout << temp[i] << " ";
    }
    return 0;
}