Cod sursa(job #1011889)

Utilizator juniorOvidiu Rosca junior Data 17 octombrie 2013 18:32:11
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fi ("scmax.in");
ofstream fo ("scmax.out");
int n, nes, gasit, i, e, ind[100001], a[100001], p[100001];

int caut (int v) { // valoarea cautata
  int s = 1, d = nes, m;
  do {
    m = (s + d) / 2;
    if (a[ind[m]] < v and v <= a[ind[m+1]])
      return m + 1;
    else
      if (v < a[ind[m]])
        d = m - 1;
      else
        s = m + 1;
  } while (s <= d);
  return 1;
}

int main () {
  fi >> n;
  for (i = 1; i <= n; i++)
    fi >> a[i];
  nes = 1; ind[1] = 1;
  for (i = 2; i <= n; i++) {
    if (a[i] > a[ind[nes]]) {
      p[i] = nes; nes++; ind[nes] = i;
    }
    else { // Cautam cel mai mic element >= a[i], al carui pozitie a fost retinuta in ind
      gasit = caut(a[i]);
      ind[gasit] = i;
    }
/*
    cout << "i = " << i << endl;
    for (e = 1; e <= nes; e++)
      cout << ind[e] << ' ';
    cout << endl;
    for (e = 1; e <= nes; e++)
      cout << a[ind[e]] << ' ';
    cout << endl;*/

  }
  fo << nes;
  return 0;
}