Cod sursa(job #2022338)

Utilizator Y0da1NUME JMECHER Y0da1 Data 16 septembrie 2017 13:08:40
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int n, a[100002];
int lis;
int d[100002];      ///d[i] - ultimul element al lisului cu i elemente
int poz[100002];

int cautbin(int nr, int b, int e)
{
    int mid = (b + e)/2;
    while(b < e)
    {
    mid = (b + e)/2;
        if(d[mid] >= nr)
            e = mid;
        else
            b = mid + 1;
    }
    return b;
}

int main()
{
    ifstream in ("scmax.in");
    ofstream out ("scmax.out");

    int lo;

    in>>n;
    for(int i = 0; i < n; ++i)
        in>>a[i];
    lis=1;
    d[lis]=a[0];


    for (int i=1; i < n; ++i)
    {
        if(a[i] > d[lis])
		{
		    ++lis;
			d[lis] = a[i];
			poz[lis]=d[lis-1];
		}
		else
		{
        //    cout<<"Caut in 1, "<<lis<<"...\n";
		    lo=cautbin(a[i], 1, lis);
		    d[lo]=a[i];
		//    cout<<"Pun pe d("<<lo<<") "<<a[i]<<"\n";
		}
		//for (int j=1; j <= 6; ++j)
        //    cout<<d[j]<<" ";
        //cout<<"\n";
    }
    //for (int j=1; j <= 6; ++j)
    //    cout<<d[j]<<" ";
    //cout<<"\n";
    //cout<<lis<<"\n";
    //for(int i=2;i<=lis;++i)
    //    cout<<poz[i]<<" ";
    //cout<<d[lis]<<" ";

    out<<lis<<"\n";
    for(int i=2;i<=lis;++i)
        out<<poz[i]<<" ";
    out<<d[lis]<<" ";
    return 0;
}