Cod sursa(job #2874752)

Utilizator cristianabalcanuCristiana Balcanu cristianabalcanu Data 20 martie 2022 10:31:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

int v[100005];
int poz[100005];
int cb[100005];
int pre[100005];
int n, ts;

int bin_search(int val)
{
   int pw = 1;
   while(pw <= ts)
      pw <<= 1;
   int p = 0;
   while(pw)
   {
      if(p + pw <= ts)
      {
         if(cb[p + pw] < val)
            p += pw;
      }
      pw >>= 1;
   }
   return p;
}

void solve(int p)
{
   if(p == 0)
      return;
   solve(pre[p]);
   cout << v[p] << " ";
}

int main()
{
   freopen("scmax.in", "r", stdin);
   freopen("scmax.out", "w", stdout);

   scanf("%d\n", &n);
   for(int i = 1 ; i <= n ; i++)
   {
      scanf("%d", &v[i]);
   }
   int mxp = 1;
   for(int i = 1 ; i <= n ; i++)
   {
      int p = bin_search(v[i]);
      if(p == ts)
      {
         cb[++ts] = v[i];
         poz[ts] = i;
         pre[i] = poz[p];
         mxp = i;
      }
      else
      {
         pre[i] = poz[p];
         if(cb[p + 1] > v[i])
         {
            cb[p + 1] = v[i];
            poz[p + 1] = i;
         }
      }
   }
   cout << ts << '\n';
   solve(mxp);
   cout << '\n';
   return 0;
}