Cod sursa(job #2945641)

Utilizator george-rotariuRotariu George george-rotariu Data 23 noiembrie 2022 23:04:26
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#define NMAX 100004

using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

struct element
{
    int val, poz, lg;
}dp[NMAX], nou;

int tata[NMAX], a[NMAX], rez[NMAX];
int n, i, j, nr, lgmax, imax, poz;

void cb (int x, int poz);
int main()
{
 fin>>n;
 for (i=1; i<=n; i++)
     {
      fin>>a[i];
      cb(a[i], i);
     }
 fout<<lgmax<<'\n';
 poz=dp[imax].poz; i=0;
 while (poz)
       {
        rez[++i]=a[poz];
        poz=tata[poz];
       }
 for (i=lgmax; i>=1; i--)
     fout<<rez[i]<<' ';
 return 0;
}

void cb (int x, int poz)
{
 int st, dr, mij;
 element nou;
 st=0; dr=nr+1;
 while (dr-st > 1)
       {
        mij=(st+dr)/2;
        if (dp[mij].val < x)
           dr=mij;
           else
           st=mij;
       }
 nou.lg=dp[dr].lg+1;
 nou.val=x;
 nou.poz=poz;
 tata[poz]=dp[dr].poz;
 dp[dr]=nou;
 if (dr > nr)
    nr++;
 if (dp[dr].lg > lgmax)
    {
     lgmax=dp[dr].lg;
     imax=dr;
    }
}