Cod sursa(job #2262740)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 17 octombrie 2018 19:35:51
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;

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

vector <int> v,a,previ;

int uper_bound(int x)
{
    int low=0,high=a.size()-1;
    int mid=(low+high)/2;
    while(low<high)
    {
        if(v[a[mid]]<x)
        {
            low=mid;
        }
        else
            high=mid;
    }
    return low;
}

int main()
{
    int n;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        fin>>x;
        v.push_back(x);
    }
    a.push_back(0);
    previ.push_back(-1);
    for(int i=1;i<n;i++)
    {

        if(v[i]>v[a.back()])
        {
            previ.push_back(a.back());
            a.push_back(i);
        }
        else
        {
            int it=uper_bound(v[i]);
            previ.push_back(a[it-1]);
            if(it!=0 && a[it-1]!=v[i])
            {
                a[it]=i;
            }
            else if(it==0)
                a[it]=i;

        }
    }
    stack <int> st;
    fout<<a.size()<<"\n";
    for(int i=previ.size()-1;i>=0;i=previ[i])
        st.push(v[i]);
    while(!st.empty())
    {
        fout<<st.top()<<" ";
        st.pop();
    }
    return 0;

}