Cod sursa(job #3253735)

Utilizator StefanPopescu2Popescu Stefan StefanPopescu2 Data 4 noiembrie 2024 16:56:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 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;
   // v[1]..................v[n]
   //poz[1]...............poz[n]
   
   sol[l+1]= 2000000001;
   int lmax = l;
   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 <= lmax; i++)
      fout << sol[i] << ' ';
  return 0;  
}