Cod sursa(job #2736070)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 3 aprilie 2021 10:02:36
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

const int INF = 0x3f3f3f3f3f3f3f3f;

int n, ans = 0;
int v[100100], father[100100], best[100100];
stack<int> s;

int binarySearch(int val)
{
    int left = 1, right = ans;

    while(left < right)
    {
        int mid = left + (right - left) / 2;

        if(v[best[mid]] >= val)
            right = mid;
        else
            left = mid + 1;
    }

    return left;
}

int main()
{
    in >> n;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    for(int i = 1; i <= n; i++)
    {
        /*
        for(int i = 1; i <= n; i++)
            cout << best[i] << ' ';

        cout << '\n';
        */

        if(v[i] > v[best[ans]])
        {
            ans++;
            best[ans] = i;
            father[i] = best[ans - 1];

            //cout << "IF: " << v[i] << ' ' << ans << ' ' << best[ans] << '\n';
        }
        else
        {
            int x = binarySearch(v[i]);
            best[x] = i;
            father[i] = best[x - 1];

            //cout << "ELSE: " << v[i] << ' ' << x << ' ' << father[i] << '\n';
        }
    }

    out << ans << '\n';

    int i = best[ans];

    while(i != 0)
    {
       // cout << i << ' ' << father[i] << '\n';
        s.push(v[i]);
        i = father[i];
    }

    while(!s.empty())
    {
        out << s.top() << ' ';
        s.pop();
    }

    return 0;
}