Cod sursa(job #2486041)

Utilizator LorenaMariaHantig Lorena LorenaMaria Data 2 noiembrie 2019 11:28:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>
#define INF 2000000000
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,v[100001],d[100001],k,r,poz[100001];
int cauta(int p,int r,int a)
{ int m=(p+r)/2,x=0;
  while(p<=r)
  { if(d[m]<a && x<d[m])
       x=m,p=m+1;
    else
       r=m-1;
    m=(p+r)/2;
  }
  return x;
}
int main()
{ in>>n;
  for(int i=1;i<=n;i++)
    in>>v[i];
  for(int i=1;i<=n;i++)
    d[i]=INF;
  for(int i=1;i<=n;i++)
  { int x=cauta(1,r,v[i]);
    poz[i]=x+1;
    d[x+1]=v[i];
    if(x+1>k)
    { k=x+1;
      r=i;
    }
  }
  out<<k<<'\n';
  int a=v[r],x=k;
  d[x]=a;
  for(int i=r;i>0;i--)
  { if(v[i]>=a || poz[i]<x-1)
       continue;
    d[--x]=v[i];
    a=v[i];
  }
  for(int i=1;i<=k;i++)
    out<<d[i]<<" ";
  in.close();
  out.close();
  return 0;
}