Cod sursa(job #2804635)

Utilizator victorzarzuZarzu Victor victorzarzu Data 21 noiembrie 2021 11:58:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>
#define link pair<int, int>
#define x first
#define y second

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int a[100001], t[100001], d[100001];

void read()
{
  f>>n;
  for(int i = 1;i <= n;++i)
    f>>a[i];
}
    
void reconstruct(int x)
{
  if(t[x])
    reconstruct(t[x]);
  g<<a[x]<<" ";
}

void solve()
{
  d[1] = 1;
  int len = 1;

  for(int i = 2;i <= n;++i)
  {
    int left = 1, right = len;
    while(left <= right)
    {
      int mid = (left + right) >> 1;
      if(a[d[mid]] >= a[i])
        right = mid - 1;
      else
        left = mid + 1;
    }

    if(left > len)
    {
      len++;
      d[len] = i;
      t[d[len]] = d[len - 1];
    }
    else
    {
      d[left] = i;
      t[d[left]] = d[left - 1];
    }  
  }
  g<<len<<'\n';
  reconstruct(d[len]);
}

int main()
{
  read();
  solve();
  return 0;
}