Cod sursa(job #1461598)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 16 iulie 2015 00:16:50
Problema Distincte Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <ctype.h>

#define MAX_N 100000
#define MOD 666013
#define BUFFSIZE 4096
#define APPLYMOD(x) ((x) -= (x) / MOD * MOD)

int v[MAX_N];
int cnt[MAX_N + 1];
int ans[MAX_N];

int bucket;

char buffer[BUFFSIZE];
int pos = BUFFSIZE;

inline char get(FILE *f) {
  if (pos == BUFFSIZE) {
    fread(buffer, 1, BUFFSIZE, f);
    pos = 0;
  }
  return buffer[pos++];
}

inline int readInt(FILE *f) {
  int q;
  char c;

  do {
    c = get(f);
  } while (!isdigit(c));

  q = 0;

  do {
    q = (q << 1) + (q << 3) + (c - '0');
    c = get(f);
  } while (isdigit(c));

  return q;
}

typedef struct {
  int i, j;
  int pos;
} query;

query q[MAX_N];

bool operator <(const query &a, const query &b) {
  if (a.i / bucket == b.i / bucket) {
    return a.j < b.j;
  }
  return a.i / bucket < b.i / bucket;
}

int main(void) {
  FILE *f = fopen("distincte.in", "r");
  int n, m, k;
  int lo, hi;
  int sum;

  n = readInt(f);
  k = readInt(f);
  m = readInt(f);

  bucket = (int) sqrt(n - 1) + 1;
  for (int i = 0; i < n; i++) {
    v[i] = readInt(f);
  }
  for (int i = 0; i < m; i++) {
    q[i].i = readInt(f) - 1;
    q[i].j = readInt(f) - 1;
    q[i].pos = i;
  }
  fclose(f);

  std::sort(q, q + m);

  lo = 0;
  hi = 0;
  sum = 0;

  for (int i = 0; i < m; i++) {
    while (lo < q[i].i) {
      cnt[v[lo]]--;
      if (!cnt[v[lo]]) {
        sum -= v[lo];
        APPLYMOD(sum);
      }
      lo++;
    }
    while (lo > q[i].i) {
      lo--;
      cnt[v[lo]]++;
      if (cnt[v[lo]] == 1) {
        sum += v[lo];
        APPLYMOD(sum);
      }
    }
    while (hi <= q[i].j) {
      cnt[v[hi]]++;
      if (cnt[v[hi]] == 1) {
        sum += v[hi];
        APPLYMOD(sum);
      }
      hi++;
    }
    while (hi > q[i].j + 1) {
      hi--;
      cnt[v[hi]]--;
      if (!cnt[v[hi]]) {
        sum -= v[hi];
        APPLYMOD(sum);
      }
    }
    while (sum < 0) {
      sum += MOD;
    }
    ans[q[i].pos] = sum % MOD;
  }
  f = fopen("distincte.out", "w");
  for (int i = 0; i < m; i++) {
    fprintf(f, "%d\n", ans[i]);
  }
  fclose(f);
  return 0;
}