Cod sursa(job #2143924)

Utilizator stoianmihailStoian Mihail stoianmihail Data 26 februarie 2018 13:23:47
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <algorithm>

using std::sort;

#define MAX_N 100000
#define aibSize MAX_N

typedef struct {
  int x, y, init;
} cell;

int N, M, K;
int val[MAX_N + 1];
long long int aib[aibSize + 1];
long long int ans[MAX_N + 1];
int last[MAX_N + 1];
cell q[MAX_N + 1];

bool cmp(cell a, cell b) {
  return a.y < b.y;
}

void add(int x, int val) {
  do {
    aib[x] += val;
    x += x & -x;
  } while (x <= aibSize);
}

long long int sum(int x) {
  long long int s = 0;
  while (x) {
    s += aib[x];
    x &= x - 1;
  }
  return s;
}

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

  int i;
  fscanf(f, "%d %d %d", &N, &K, &M);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &val[i]);
  }
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d", &q[i].x, &q[i].y);
    q[i].init = i;
  }
  fclose(f);

  sort(q + 1, q + M + 1, cmp);

  int ptr = 1;
  for (i = 1; i <= N; i++) {
    if (last[val[i]] == 0) {
      last[val[i]] = i;
    } else {
      add(last[val[i]], -val[i]);
      last[val[i]] = i;
    }
    add(i, +val[i]);

    while (ptr <= M && q[ptr].y == i) {
      ans[q[ptr].init] = sum(q[ptr].y) - sum(q[ptr].x - 1);
      ptr++;
    }
  }

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