Cod sursa(job #2676979)

Utilizator MenelausSontea Vladimir Menelaus Data 25 noiembrie 2020 16:35:33
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <set>
#include <map>
#include <vector>

std::ifstream in("scmax.in");
std::ofstream out("scmax.out");

const int INF=2000000001;
const int N=100001;

std::set<int> s;
std::map<int, std::pair<int, int>> m;
int v[N];

int main()
{
    int n, x;
    s.insert(INF);

    in>>n;
    for(int i=1; i<=n; i++)
    {
        in>>x;
        v[i]=x;
        if(*s.begin()>=x)
        {
            s.insert(x);
            //std::cout<<"Nu exista in sir numar mai mic de "<<x<<std::endl;
            m.insert({x, {-1, 1}});
        }
        else
        {
            std::set<int>::iterator it=s.lower_bound(x);
            int res=*std::prev(it);
            s.insert(x);

            m[x].first=res;
            m[x].second=m[res].second+1;

            //std::cout<<"Cel mai mare numar mai mic strict ca "<<x<<" este "<<res<<std::endl;
        }
    }

    int max=-1, imax=1;
    for(int i=1; i<=n; i++)
    {
        if(m[v[i]].second>max)
        {
            max=m[v[i]].second;
            imax=i;
        }
    }

    out<<m[v[imax]].second<<std::endl;

    std::vector<int> vectr;

    while(v[imax]!=-1)
    {
        //std::cout<<v[imax];
        vectr.push_back(v[imax]);
        v[imax]=m[v[imax]].first;
    }

    for(int i=vectr.size()-1; i>=0; i--)
    {
        out<<vectr[i]<<" ";
    }
}