Cod sursa(job #3364502)

Utilizator filipdanieloanFilip-Daniel Oancea filipdanieloan Data 4 septembrie 2026 13:08:36
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
using namespace std;

const int kMod = 666013;

struct BIT {
    int n;
    vector<long long> aib;

    BIT(vector<int>& v) : n(int(v.size()) - 1), aib(v.size()) {
        build(v);
    }

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

    void update(int i, int x) {
        for (; i <= n; i += lsb(i)) {
            aib[i] += x;
        }
    }

private:
    void build(vector<int>& v) {
        for (int i = 1; i <= n; ++i) {
            aib[i] += v[i];
            if (i + lsb(i) <= n) aib[i + lsb(i)] += aib[i];
        }
    }

    static int lsb(int x) {
        return (x & (-x));
    }
};

struct Query {
    int l, r, id;
    long long ans;
};

signed main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);
#endif

    int n, k, m; cin >> n >> k >> m;
    vector<int> v(n + 1);
    vector<Query> queries(m + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }
    for (int i = 1; i <= m; ++i) {
        cin >> queries[i].l >> queries[i].r;
        queries[i].id = i;
    }

    sort(queries.begin() + 1, queries.end(), [](Query a, Query b) {
        return a.r < b.r;
    });

    vector<int> pos(n + 1);
    BIT aib(pos);

    int ans = 0;
    vector<int> last(k + 1);
    for (int i = 1, idx = 1; i <= n && idx <= m; ++i) {
        if (last[v[i]]) aib.update(last[v[i]], -v[i]);
        aib.update(i, v[i]);
        last[v[i]] = i;
        while (idx <= m && queries[idx].r == i) {
            queries[idx].ans = aib.query(i) - aib.query(queries[idx].l - 1);
            ++idx;
        }
    }

    sort(queries.begin() + 1, queries.end(), [](Query a, Query b) {
        return a.id < b.id;
    });

    for (int i = 1; i <= m; ++i) {
        cout << queries[i].ans % 666013 << '\n';
    }

    return 0;
}