Cod sursa(job #2190869)

Utilizator hrazvanHarsan Razvan hrazvan Data 31 martie 2018 22:03:00
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <cstring>
#define MAXN 10000000
int v[2][MAXN], nxt[MAXN], ut[1<<16], prim[1<<16];
int msk[2] = {(1<<16) - 1, (((1 << 16)- 1) << 16)};
int sft[2] = {1, (1 << 16)};

int main(){
  FILE *in = fopen("radixsort.in", "r");
  int n, a, b, c, p, l, i, j, m, x;
  fscanf(in, "%d%d%d%d", &n, &a, &b, &c);
  fclose(in);
  v[0][0] = b;
  for(i = 1; i < n; i++){
    v[0][i] = (1LL * a * v[0][i - 1] + b) % c;
  }
  l = 0;
  for(m = 0; m < 2; m++){
    l = !l;
    memset(ut, -1, sizeof ut);
    memset(prim, -1, sizeof prim);
    memset(nxt, -1, sizeof nxt);
    for(i = 0; i < n; i++){
      x = (v[!l][i] & msk[m]) / sft[m];
      if(prim[x] == -1){
        prim[x] = ut[x] = i;
      }
      else{
        nxt[ut[x]] = i;
        ut[x] = i;
      }
    }
    j = 0;
    for(i = 0; i < (1 << 16); i++){
      p = prim[i];
      while(p != -1){
        v[l][j] = v[!l][p];
        p = nxt[p];
        j++;
      }
    }
  }
  FILE *out = fopen("radixsort.out", "w");
  for(i = 0; i < n; i += 10)
    fprintf(out, "%d ", v[l][i]);
  return 0;
}