Cod sursa(job #1777031)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 octombrie 2016 00:08:55
Problema Order Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>
#define zero(x) (x&(-x))
int aib[30001], sol[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, poz, nrcop, aux;
    fin=fopen("order.in", "r");
    fscanf(fin, "%d", &n);
    fclose(fin);
    for(i=1; i<=n; i++)
      update(i, 1, n);
    poz=2; nrcop=n;
    for(i=1; i<=n; i++){
      --nrcop;
      aux=cautBin(poz, n);
      update(aux, -1, n);
      sol[i]=aux;
      poz+=i;
      if(nrcop)
        poz=(poz-1)%nrcop+1;
    }
    fout=fopen("order.out", "w");
    for(i=1; i<=n; i++)
      fprintf(fout, "%d ", sol[i]);
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}