Cod sursa(job #3166005)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 7 noiembrie 2023 13:46:01
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <algorithm>
#include <unordered_map>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
struct el
{
    int nr,poz;
};
el aib[100001];
int frr[100001],i,maxc,n,poz,nr,pozi,x[100001],v[100001],t[100001];
unordered_map <int,int> fr;
void f (int x)
{
    if (x!=0)
    {
        f (t[x]);
        fout<<frr[x]<<" ";
    }
}
void query (int i)
{
    for (; i>0; i-=(i&-i))
    {
        if (aib[i].nr>nr)
        {
            nr=aib[i].nr;
            pozi=aib[i].poz;
        }
    }
}
void update (int i,int val)
{
    int poz=i;
    for (; i<=n; i+=(i&-i))
    {
        if (val>aib[i].nr)
        {
            aib[i].nr=val;
            aib[i].poz=poz;
        }
    }
}
int main ()
{
    fin>>n;
    for (i=1; i<=n; i++)
    {
        fin>>v[i];
        x[i]=v[i];
    }
    sort (x+1,x+n+1);
    fr[x[1]]=++nr;
    frr[nr]=x[1];
    for (i=2; i<=n; i++)
    {
        if (x[i]!=x[i-1])
        {
            fr[x[i]]=++nr;
            frr[nr]=x[i];
        }
    }
    for (i=1; i<=n; i++)
    {
        v[i]=fr[v[i]];
        nr=pozi=0;
        query (v[i]-1);
        if (nr+1>maxc)
        {
            maxc=nr+1;
            poz=v[i];
        }
        update (v[i],maxc);
        t[v[i]]=pozi;
    }
    fout<<maxc<<"\n";
    f (poz);
    return 0;
}