Cod sursa(job #3251799)

Utilizator Dani111Gheorghe Daniel Dani111 Data 27 octombrie 2024 00:26:33
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX = 3 * 1e5;
int lastap[MAX + 3], A[MAX + 3];

long long aib[MAX + 3];
int N, K, Q;
vector<pair<int, int>>query[MAX + 3];
long long ans1[MAX + 3];


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

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

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

    cin >> N >> K >> Q;

    for(int i = 1; i <= N; i++) {
        cin >> A[i];
    }

    for(int i = 1; i <= Q; i++) {
        int le, ri; cin >> le >> ri;
        query[ri].push_back({le, i});
    }

    for(int i = 1; i <= N; i++) {
        if(lastap[A[i]]) {
            update(lastap[A[i]], -A[i]);
        }
        update(i, A[i]);
        lastap[A[i]] = i;


        for(auto j : query[i]) {
            int le = j.first;
            int ri = i;

            long long ans = query1(ri) - query1(le - 1);
            ans1[j.second] = ans;
        }
    }

    for(int i = 1; i <= Q; i++) {
        cout << ans1[i] << '\n';
    }
}