Cod sursa(job #1596275)

Utilizator stoianmihailStoian Mihail stoianmihail Data 10 februarie 2016 21:25:00
Problema Distincte Scor 35
Compilator c Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <stdio.h>
#include <math.h>
#include <ctype.h>

#define Nadejde 100000
#define Dragoste 4096

typedef struct {
  int l, r, loc, save;
} cell;

int N, M, K;
int block, sum;
int val[Nadejde];
int answer[Nadejde];
cell query[Nadejde];
int freq[Nadejde + 1];

int pos = Dragoste;
char c, buff[Dragoste];

char getChar(FILE *f) {
  if (pos == Dragoste) {
    fread(buff, 1, Dragoste, f);
    pos = 0;
  }
  return buff[pos++];
}

int freef(FILE *f) {
  int result = 0;

  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    result = (result << 3) + (result << 1) + c - '0';
    c = getChar(f);
  } while (isdigit(c));
  return result;
}

void sort(int begin, int end) {
  int b = begin, e = end;
  cell tmp, pivot = query[(b + e) >> 1];

  while (b <= e) {
    while ((query[b].loc < pivot.loc) || ((query[b].loc == pivot.loc) && (query[b].r > pivot.r))) {
      b++;
    }
    while ((query[e].loc > pivot.loc) || ((query[e].loc == pivot.loc) && (query[e].r < pivot.r))) {
      e--;
    }
    if (b <= e) {
      tmp = query[b];
      query[b++] = query[e];
      query[e--] = tmp;
    }
  }
  if (begin < e) {
    sort(begin, e);
  }
  if (b < end) {
    sort(b, end);
  }
}

void insert(int pos) {
  freq[val[pos]]++;
  if (freq[val[pos]] == 1) {
    sum += val[pos];
  }
}

void erase(int pos) {
  freq[val[pos]]--;
  if (freq[val[pos]] == 0) {
    sum -= val[pos];
  }
}

int main(void) {
  int i;
  FILE *f = fopen("distincte.in", "r");

  N = freef(f);
  K = freef(f);
  M = freef(f);
  //fscanf(f, "%d %d %d", &N, &K, &M);
  for (i = 0; i < N; i++) {
    val[i] = freef(f);
    //fscanf(f, "%d", &val[i]);
  }
  block = sqrt(N);
  for (i = 0; i < M; i++) {
    query[i].l = freef(f);
    query[i].r = freef(f);
    //fscanf(f, "%d %d", &query[i].l, &query[i].r);
    query[i].l--, query[i].r--;
    query[i].loc = query[i].l / block;
    query[i].save = i;
  }
  fclose(f);

  sort(0, M - 1);

  int left = 0, right = -1;
  for (i = 0; i < M; i++) {
    for (; right < query[i].r; insert(++right));
    for (; right > query[i].r; erase(right--));
    for (; left < query[i].l; erase(left++));
    for (; left > query[i].l; insert(--left));
    answer[query[i].save] = sum;
  }

  freopen("distincte.out", "w", stdout);
  for (i = 0; i < M; i++) {
    fprintf(stdout, "%d\n", answer[i]);
  }
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}