Cod sursa(job #2505591)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 7 decembrie 2019 07:30:59
Problema Subsir crescator maximal Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 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];
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';

    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";
        }
    }

    out << query(n);

    return 0;
}