Cod sursa(job #3253734)

Utilizator Petru_77Panait Mihai-Petru Petru_77 Data 4 noiembrie 2024 16:56:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>
using namespace std;

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

  int v[100001];
  int poz[100001];
  int s[100001],l;
  int sol[100001];
 void bi_search(int i) {


   if(v[i]<=s[1]){ s[1]=v[i]; poz[i]=1;}
   else if(v[i]> s[l]){
     s[l + 1] = v[i]; poz[i] = l + 1;
     l ++;

   }
   else {
   int st = 1, dr = l;

   while(st + 1 < dr) {

    int mij = (st + dr) / 2;
    if(v[i] <= s[mij])
     dr = mij;
    else
     st = mij;
   }
   s[dr] = v[i], poz[i] = dr;

   }
 }

 int main(){
   int n;
   fin >> n;
   for(int i = 1 ; i <= n ; i++)
   {
     fin >> v[i];
   }


   s[1]=v[1];
   poz[1]=1;  l=1;

   for (int i = 2; i <= n; i++)
   {
     bi_search(i);
   }

   fout<<l<<endl;
   int lc = l;
   // v[1]..................v[n]
   //poz[1]...............poz[n]
   sol[l+1]= 2000000001;
   for (int i = n; i >= 1; i--)
    if (poz[i] == l && v[i]<sol[l+1] )
    {
      sol[l] = v[i];
      l--;

    }
    for (int i = 1; i <= lc; i++)
      fout << sol[i] << ' ';
  return 0;
}