Cod sursa(job #2487405)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 4 noiembrie 2019 18:38:34
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <map>
#include <stack>

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int i,n,v[100005],l[100005],aib[100005],x,Max,p,poz,cod[100005],a[100005];
map <int,int> mp;
stack <int> st;
int ub(int x)
{
    return x&(-x);
}
void update(int x, int val)
{
    for(int i=x;i<=n;i+=ub(i))
        if(aib[i]<val)
            aib[i]=val;
}
int query(int x)
{
    int s=0;
    for(int i=x;i>=1;i-=ub(i))
        if(aib[i]>s)
            s=aib[i];
    return s;
}
void normalizare()
{
    int cnt=0;
    for(int i=1;i<=n;i++)
        mp[a[i]]++;
    for(auto it : mp)
    {
        ++cnt;
        cod[it.first]=cnt;
    }
    for(i=1;i<=n;i++)
        v[i]=cod[a[i]];
}
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        f>>a[i];
    normalizare();
    for(i=1;i<=n;i++)
    {
        x=query(v[i]-1)+1;
        l[i]=x;
        if(x>Max)
        {
            Max=x;
            p=i;
        }
        update(v[i],x);
    }
    g<<Max<<'\n';
    poz=p;
    for(i=p-1;i>=1;i--)
    {
        x=l[i];
        if(v[i]<v[poz] && x==Max-1)
        {
            poz=i;
            Max=x;
            st.push(a[i]);
        }
    }
    while(!st.empty())
    {
        g<<st.top()<<' ';
        st.pop();
    }
    g<<a[p]<<'\n';
    return 0;
}