Cod sursa(job #1506967)

Utilizator hrazvanHarsan Razvan hrazvan Data 21 octombrie 2015 09:42:21
Problema P-sir Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#define MAXN 2000
#define MOD 4294967296
unsigned int d[MAXN][MAXN];
int v[MAXN];
int p[MAXN][MAXN];
unsigned int sum[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 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;
}

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

int main(){
  FILE *in = fopen("psir.in", "r");
  int n, i, j;
  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];
    p[i][0] = 0;
    for(j = 1; j < i; j++){
      d[i][j] = 1 + interv(j, i);
      rez += d[i][j];
      p[i][j] = j;
    }
    qs(0, i - 1, i);
    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, "%d", rez);
  fclose(out);
  return 0;
}