Cod sursa(job #2456937)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 15 septembrie 2019 21:35:54
Problema Distincte Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long ll;
const int mod = 666013;

int add(int a, int b) {
  a += b;
  if (a >= mod) {
    return a - mod;
  }
  if (a < 0) {
    return a + mod;
  }
  return a;
}

const int N = 100000 + 7;
int n, k, m;
int a[N], f[N];
int bucket;

struct segment {
  int l;
  int r;
  int i;
};

bool operator < (segment a, segment b) {
  if (a.l / bucket == b.l / bucket) {
    return a.r < b.r;
  }
  return a.l < b.l;
}
segment b[N];
int ans[N], sum;

void add(int x) {
  x = a[x];
  f[x]++;
  if (f[x] == 1) {
    sum = add(sum, x);
  }
}

void del(int x) {
  x = a[x];
  f[x]--;
  if (f[x] == 0) {
    sum = add(sum, -x);
  }
}

int l = 1, r = 1;

void bring_l(int lp) {
  while (l < lp) {
    del(l++);
  }
  while (lp < l) {
    add(--l);
  }
}

void bring_r(int rp) {
  while (r < rp) {
    add(++r);
  }
  while (r > rp) {
    del(r--);
  }
}

int main() {
  freopen ("distincte.in", "r", stdin);
  freopen ("distincte.out", "w", stdout);

  scanf("%d %d %d", &n, &k, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &b[i].l, &b[i].r);
    b[i].i = i;
  }

  while ((bucket + 1) * (bucket + 1) <= n) {
    bucket++;
  }
  sort(b + 1, b + m + 1);

  add(1);
  for (int i = 1; i <= m; i++) {
    bring_l(b[i].l);
    bring_r(b[i].r);
    bring_l(b[i].l);
    ans[b[i].i] = sum;
  }

  for (int i = 1; i <= m; i++) {
    printf("%d\n", ans[i]);
  }

  return 0;
}