Cod sursa(job #1506974)

Utilizator hrazvanHarsan Razvan hrazvan Data 21 octombrie 2015 09:49:54
Problema P-sir Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define MAXN 2000
unsigned int d[MAXN][MAXN];
int v[MAXN];
int p[MAXN][MAXN];

inline int caut(int l, int x){
  int i = -1, pas;
  for(pas = (1 << 10); pas > 0; pas >>= 1){
    if(l > i + pas && v[p[l][i + pas]] < x)
      i += pas;
  }
  return i;
}

inline unsigned int interv(int x, int y){
  int a;
  if(v[x] < v[y]){
    a = caut(x, v[y] + 1);
    if(a != -1)
      return d[x][p[x][x - 1]] - d[x][p[x][a]];
  }
  else  if(v[x] > v[y]){
    a = caut(x, v[y]);
    if(a != -1)
    return d[x][p[x][a]];
  }
  return 0;
}

int main(){
  FILE *in = fopen("psir.in", "r");
  int n, i, j, k;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++)
    fscanf(in, "%d", &v[i]);
  fclose(in);
  unsigned int rez = 0;
  for(i = 1; i < n; i++){
    d[i][0] = 1;
    rez += d[i][0];
    for(j = 1; j < i; j++){
      d[i][j] = 1 + interv(j, i);
      rez += d[i][j];
    }
    for(j = 0; j < i - 1; j++)
      p[i][j] = p[i - 1][j];
    j = 0;
    while(j < i - 1 && v[i - 1] > v[p[i][j]])
      j++;
    for(k = i - 1; k > j; k--)
      p[i][k] = p[i][k - 1];
    p[i][j] = i - 1;
    for(j = 1; j < i; j++)
      d[i][p[i][j]] += d[i][p[i][j - 1]];
  }
  FILE *out = fopen("psir.out", "w");
  fprintf(out, "%u", rez);
  fclose(out);
  return 0;
}