Cod sursa(job #2845180)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 7 februarie 2022 16:43:48
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

ifstream fin ("distincte.in");
ofstream fout ("distincte.out");

const int NMAX = 1e5;

struct Query {
  int st, dr, pos, ans;
};

int v[NMAX + 2];
int last[NMAX + 2];
int aib[NMAX + 2];
Query arr[NMAX + 2];

bool cmp1 (Query A, Query B) {
  return A.dr < B.dr;
}

bool cmp2 (Query A, Query B) {
  return A.pos < B.pos;
}

int query (int pos) {
  int s = 0;
  for (int i = pos; i > 0; i -= (i & (-i)))
    s += aib[i];
  return s;
}

void update (int pos, int val) {
  for (int i = pos; i <= NMAX; i += (i & (-i)))
    aib[i] += val;
}

signed main() {
  int n, k, m, i, index;
  fin >> n >> k >> m;

  for (i = 1; i <= n; ++i)
    fin >> v[i];

  for (i = 1; i <= m; ++i) {
    fin >> arr[i].st >> arr[i].dr;
    arr[i].pos = i;
  }

  sort(arr + 1, arr + 1 + m, cmp1);
  index = 0;
  for (i = 1; i <= m; ++i) {
    while (index + 1 <= arr[i].dr) {
      ++index;
      if (last[v[index]])
        update(last[v[index]], -v[index]);

      last[v[index]] = index;
      update(index, v[index]);
    }
    arr[i].ans = query(arr[i].dr) - query(arr[i].st - 1);
  }

  sort(arr + 1, arr + 1 + m, cmp2);
  for (i = 1; i <= m; ++i)
    fout << arr[i].ans << "\n";
  return 0;
}