Cod sursa(job #1937747)

Utilizator LazarAndreiLazar Andrei Teodor LazarAndrei Data 24 martie 2017 10:49:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
using namespace std;

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

const int NMAX = 100005;

int arr[NMAX], best[NMAX], p[NMAX], length = 1, N;

int get_position (int x) {
    int pos = 0;
    int left = 1, right = x;
    while (left <= right) {
        int mid = left + (right - left)/2;
        if (arr[best[mid]] < arr[x]) {
            pos = mid;
            left = mid + 1;
        }
        else right = mid - 1;
    }

    return pos;
}



void print (int x) {
    if (x == 0)
        return;
    print (p[x]);
    out << arr[x] << " ";
}

int main()
{
   in >> N;
   for (int i = 1; i <= N; ++ i) {
       in >> arr[i];
   }

   arr[0] = 2e9 + 2;
   for (int i = 1; i <= N; ++ i) {
        int position = get_position (i);

        best[position + 1] = i;
        p[i] = best[position];
   }

   while (best[length]) {
      length ++ ;
   }

   out << length - 1 << '\n';
   print (best[length - 1]);

}