Cod sursa(job #1425387)

Utilizator cella.florescuCella Florescu cella.florescu Data 27 aprilie 2015 13:21:13
Problema Schi Scor 100
Compilator c Status done
Runda pregatire-lot-aib Marime 1.02 kb
#include <stdio.h>
#include <stdlib.h>
#define zero(x) (x&(-x))
int aib[30001], v[30001], clas[30001];

inline void update(int poz, int val, int n){
  for(poz; poz<=n; poz+=zero(poz))
    aib[poz]+=val;
}

inline int suma(int poz){
  int sum=0;
  for(poz; poz>0; poz-=zero(poz))
    sum+=aib[poz];
  return sum;
}

inline int cautBin(int val, int n){
  int b=1, e=n, m, x, min=2000000000;
  while(b<=e){
    m=(b+e)/2;
    x=suma(m);
    if(x==val && m<min)
      min=m;
    else if(x<val)
      b=m+1;
    else
      e=m-1;
  }
  return min;
}


int main()
{
    FILE *fin, *fout;
    int n, i, a;
    fin=fopen("schi.in", "r");
    fscanf(fin, "%d", &n);
    for(i=1; i<=n; i++){
      fscanf(fin, "%d", &v[i]);
      aib[i]=zero(i);
    }
    fclose(fin);
    for(i=n; i>0; i--){
      a=cautBin(v[i], n);
      clas[a]=i;
      update(a, -1, n);
    }
    fout=fopen("schi.out", "w");
    for(i=1; i<=n; i++)
      fprintf(fout, "%d\n", clas[i]);
    fclose(fout);
    return 0;
}