Cod sursa(job #3291317)

Utilizator unomMirel Costel unom Data 4 aprilie 2025 08:49:56
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <map>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");
int n, cnt, ans;
int v[100005];
int aib[100005];
map<int, int> mp;

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

int query(int poz)
{
    int ans = 0;
    for(int i = poz; i>=1; i-=(i&-i))
    {
        ans = max(ans, aib[i]);
    }

    return ans;
}

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

        mp[v[i]] = 1;
    }

    for(auto &it: mp)
    {
        cnt++;

        it.second = cnt;
    }

    for(int i = 1; i<=n; i++)
    {
        v[i] = mp[v[i]];

        //out<<v[i]<<" ";
    }

    for(int i = 1; i<=n; i++)
    {
        int best = query(v[i] - 1) + 1;

        update(v[i], best);

        ans = max(ans, best);
    }

    out<<ans<<'\n';

    return 0;
}