Cod sursa(job #2304667)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 18 decembrie 2018 14:18:35
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
struct Secv {
  int ind, st, dr;
};
Secv s[NMAX];
int v[NMAX];
long long sol[NMAX];
long long aib[NMAX];
int p[NMAX];
bool cmp(Secv first, Secv second) {
  return first.dr < second.dr;
}
void update(int n, int poz, int val) {
  while(poz <= n) {
    aib[poz] += val;
    poz += poz&(-poz);
  }
}
long long query(int poz) {
  long long ans = 0;
  while(poz) {
    ans += aib[poz];
    poz -= poz&(-poz);
  }
  return ans;
}

int main() {
  int n, k, m;
  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", &v[i]);
  }
  for(int i = 1; i <= m; i++) {
    s[i].ind = i;
    scanf("%d%d", &s[i].st, &s[i].dr);
  }
  sort(s + 1, s + m + 1, cmp);
  int j = 1;
  for(int i = 1; i <= n; i++) {
    int val = v[i];
    if(p[val]) {
      update(n, p[val], -val);
    }
    update(n, i, val);
    while(j <= m && s[j].dr == i) {
      long long sol1 = query(i);
      long long sol2 = query(s[j].st - 1);
      sol[s[j].ind] = sol1 - sol2;
      j++;
    }
    p[val] = i;
  }
  for(int i = 1; i <= m; i++) {
    printf("%lld\n", sol[i]);
  }
  return 0;
}