Cod sursa(job #2698896)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 23 ianuarie 2021 11:10:36
Problema Subsir crescator maximal Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define ll long long
//#define int ll
using namespace std;
 
ifstream f("scmax.in");
ofstream g("scmax.out");
 
 
int n;
int aib[100005];
int v[100005];
int ans[100005];
vector < int > normm;
unordered_map < int ,int > mp;
 
 
int query(int poz)
{   int r=0;
    for(int i=poz;i>0;i-=(i&(-i)))
    {
        r=max(r,aib[i]);
    }
    return r;
}
void update(int poz,int x)
{
    for(int i=poz;i<=n;i+=(i&(-i)))
    {
        aib[i]=max(aib[i],x);
    }
    return ;
}
 
main()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>v[i];
        normm.push_back(v[i]);
    }
    sort(normm.begin(),normm.end());
    for(int i=0;i<normm.size();i++)
        mp[normm[i]]=i+1;
 
    for(int i=1;i<=n;i++)
    {
        ans[i] = query(mp[v[i]]-1)+1;
        update(mp[v[i]],ans[i]);
    }
    g<<*max_element(ans+1,ans+n+1)<<'\n';
    int target = *max_element(ans+1,ans+n+1);
 
    vector < int > raspuns;
 
    for(int i=n;i;i--)
    {
        if(ans[i]==target)
        {
            raspuns.push_back(v[i]);
            target--;
        }
    }
    reverse(raspuns.begin(),raspuns.end());
    for(auto x:raspuns) g<<x<< ' ';
 
 
    return 0;
 
}