Cod sursa(job #2427690)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 1 iunie 2019 17:09:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
int v[100500];
int l[100500];
int pre[100500];
int countt;

int bin_search(int x, int low, int high)
{
  if(low==high)
    return low;
  if(low==high-1)
  {
    if(v[l[low]]==x) return -1;
    if(v[l[high]]==x) return -1;
    if(v[l[high]]<x) return low;
    return high;
  }
  int m = low + (high-low)/2;
  if(v[l[m]]>x)
    return bin_search(x,low,m);
  if(v[l[m]]==x) return -1;
  return bin_search(x,m,high);
}

void write(int x)
{
  if(x==-1)return;
  write(pre[x]);
  fout<<v[x]<<" ";
}

void debug()
{
  for(int i=0;i<n;i++)
    std::cout<<pre[i]<<" ";
  std::cout<<"\n";
  for(int i=0;i<n;i++)
    std::cout<<l[i]<<" ";
  std::cout<<"\n";
  std::cout<<"\n";
}

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

//    if(countt>=1)
 //     write(l[countt-1]);
  //  debug();
    if(countt==0)
    {
      l[0]=i;
      pre[i]=-1;
      countt++;
    }
    else if(v[l[0]]>v[i])
    {
      l[0]=i;
      pre[i]=-1;
    }
    else if(v[l[countt-1]]<v[i])
    {
      pre[i]=l[countt-1];
      countt++;
      l[countt-1]=i;
    }
    else
    {
      int place = bin_search(v[i],0,countt);
      if(place==-1)continue;
      pre[i]=l[place-1];
      l[place]=i;
    }//*/
  }
  fout<<countt<<"\n";
  write(l[countt-1]);
}