Cod sursa(job #1225676)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 septembrie 2014 12:55:10
Problema Secv Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#define MAXN 5000
int v[MAXN + 1], s[MAXN], m[MAXN + 1], st[MAXN + 1];

void qs(int st, int dr){
  int i = st, j = dr, piv = s[(i + j) / 2], aux;
  while(i <= j){
    while(s[i] < piv)  i++;
    while(s[j] > piv)  j--;
    if(i <= j){
      aux = s[i];  s[i] = s[j];  s[j] = aux;
      i++;  j--;
    }
  }
  if(st < j)  qs(st, j);
  if(i < dr)  qs(i, dr);
  return ;
}

int caut(int x, int n){
  int i = 0, pas = 1 << 12;
  while(pas > 0){
    if(i + pas <= n &&m[i + pas] != -1 && v[m[i + pas]] < x){
      i += pas;
    }
    pas >>= 1;
  }
  return i;
}

int main(){
  FILE *in = fopen("secv.in", "r");
  int n,i;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &v[i]);
    s[i] = v[i];
    m[i] = -1;
  }
  m[n] = -1;
  fclose(in);
  qs(0, n - 1);
  int nr = 0, prev = -1;
  for(i = 0; i < n; i++){
    if(s[i] != prev){
      prev = s[i];
      nr++;
    }
  }
  m[0] = n;
  v[n] = -1;
  int poz;
  for(i = 0; i < n; i++){
    poz = caut(v[i], n);
    if(m[poz + 1] == -1 || (m[poz + 1] != -1 && v[m[poz + 1]] >= v[i])){
      m[poz + 1] = i;
      if(poz == 0)  st[1] = i;
      else          st[poz + 1] = st[poz];
    }
  }
  FILE *out = fopen("secv.out", "w");
  if(m[nr] == -1) fprintf(out, "-1");
  else            fprintf(out, "%d", m[nr] - st[nr] + 1);
  fclose(out);
  return 0;
}