Cod sursa(job #2208074)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 28 mai 2018 10:45:58
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>

#define terminal0(x) x & -x

const int MAX_N = 100000;
const int MAX_M = 100000;
const int MOD = 666013;

struct Query {
  int left;
  int right;
  int index;
  
  bool operator <(const Query &other) const {
    return this->right < other.right;
  }
};

int n;
long long aib[1 + MAX_N];
int v[1 + MAX_N];
int last[1 + MAX_N];
Query queries[1 + MAX_M];
long long ans[1 + MAX_M];

void update(int poz, int val) {
  for (int i = poz; i <= n; i += terminal0(i))
    aib[i] += 1LL * val;
}

long long query(int poz) {
  long long ans = 0;
  for (int i = poz; i >= 1; i -= terminal0(i))
    ans += aib[i];
  return ans;
}

int main() {
  freopen("distincte.in", "r", stdin);
  freopen("distincte.out", "w", stdout);
  
  int k, m;
  scanf("%d%d%d", &n, &k, &m);
  for (int i = 1; i <= n; i++)
    scanf("%d", &v[i]);
  for (int i = 1; i <= m; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    queries[i] = {l, r, i};
  }
  std::sort(queries + 1, queries + m + 1);
  int poz = 1;
  for (int i = 1; i <= n; i++) {
    update(i, v[i]);
    if (last[v[i]] != 0)
      update(last[v[i]], -v[i]);
    last[v[i]] = i;
    while (poz <= m && queries[poz].right == i) {
      ans[queries[poz].index] = query(i) - query(queries[poz].left - 1);
      poz++;
    }
  }
  for (int i = 1; i <= m; i++)
    printf("%lld\n", ans[i] % MOD);
  return 0;
}