Cod sursa(job #2505592)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 7 decembrie 2019 07:52:15
Problema Subsir crescator maximal Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <utility>
#include <algorithm>
#define DEBUG 0

using namespace std;

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

int tree[100001];
pair<int, int> v[100001], rez[100001];
int n;

int query(int poz)
{
    int s = 0;
    for(int i = poz; i; i -= i&-i)
        s = max(s, tree[i]);
    return s;
}

void update(int poz, int val)
{
    for(int i = poz; i <= n; i += i&-i)
        tree[i] = max(val, tree[i]);
}

bool comp(pair<int, int> x, pair<int, int> y)
{
    if(x.first == y.first)
        return(x.second > y.second);
    return(x.first < y.first);
}

int main()
{
    in >> n;

    for(int i = 1; i <= n; i++)
    {
        in >> v[i].first;
        v[i].second = i;
    }

    sort(v+1, v+n+1, comp);

    if(DEBUG)
        for(int i = 1; i <= n; i++)
            cout << v[i].first << ' ' << v[i].second << '\n';

    int k = 0;

    for(int i = 1; i <= n; i++)
    {
        int nr = query(v[i].second-1);
        update(v[i].second, nr+1);

        if(DEBUG)
        {
            cout << nr << '\n' << v[i].first << ' ' << v[i].second << "\n\n";
        }

        if(k == 0)
            rez[k++] = v[i];
        else
            if(rez[k-1].second < v[i].second)
                rez[k++] = v[i];
    }

    out << query(n) << '\n';
    for(int i = 0; i < k; i++)
        out << rez[i].first << ' ';
    return 0;
}