Cod sursa(job #3259070)

Utilizator Manolea_Teodor_StefanManolea Teodor Stefan Manolea_Teodor_Stefan Data 24 noiembrie 2024 23:45:12
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
#define nmax 100005
#define ll long long
#define mod 666013
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
struct cv {
    int st;
    int dr;
    int poz;
    friend bool operator<(const cv& a, const cv& b) {
        return a.dr < b.dr;
    }
};

ll n, k, m;
array<ll,nmax> v, aib, sh, sol;

array<cv,nmax> q;
void update(int p, int val) {
    for (; p <= n; p += (p & -p)) {
        aib[p] += val;
    }
}
ll query(int p) {
    ll sum = 0;
    for (; p > 0; p -= (p & -p)) {
        sum += aib[p];
    }
    return sum;
}


int main() {
    fin >> n >> k >> m;
    for (int i = 1; i <= n; i++) fin >> v[i];
    for (int i = 1; i <= m; i++) {
        fin >> q[i].st >> q[i].dr;
        q[i].poz = i;
    }
    sort(q.begin() + 1, q.begin() + m + 1);

    int j = 0;

    for (int i = 1; i <= m; i++) {

        while (j < q[i].dr) {
            j++;
            if (sh[v[j]]) {
                update(sh[v[j]], -v[j]);
            }
            sh[v[j]] = j;
            update(j, v[j]);
        }
        sol[q[i].poz] = (query(q[i].dr) - query(q[i].st - 1) + mod) % mod;
    }
    for (int i = 1; i <= m; i++) fout << sol[i] << '\n';
    return 0;
}