Cod sursa(job #3139098)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 24 iunie 2023 22:47:49
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

struct str{
    long long l, r, idx;
    bool operator < (const str & aux) const
    {
        if (r != aux.r)
        {
            return r < aux.r;
        }
        return l < aux.l;
    }
};

const int max_size = 1e5 + 1, max_aint = 4e5 + 1, mod = 666013;

long long v[max_size], aint[max_aint], ult[max_size], ans[max_size];
str qr[max_size];

void upd (long long l, long long r, long long poz, long long val, long long nod)
{
    if (l == r)
    {
        aint[nod] += val;
        return;
    }
    long long m = (l + r) / 2;
    if (poz <= m)
    {
        upd(l, m, poz, val, 2 * nod);
    }
    else
    {
        upd(m + 1, r, poz, val, 2 * nod + 1);
    }
    aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}

long long query (long long l, long long r, long long st, long long dr, long long nod)
{
    if (st <= l && r <= dr)
    {
        return aint[nod];
    }
    long long m = (l + r) / 2, s1 = 0, s2 = 0;
    if (st <= m)
    {
        s1 = query(l, m, st, dr, 2 * nod);
    }
    if (dr > m)
    {
        s2 = query(m + 1, r, st, dr, 2 * nod + 1);
    }
    return s1 + s2;
}

signed main ()
{
    long long n, k, m;
    in >> n >> k >> m;
    for (long long i = 1; i <= n; i++)
    {
        in >> v[i];
    }
    for (long long i = 1; i <= m; i++)
    {
        in >> qr[i].l >> qr[i].r;
        qr[i].idx = i;
    }
    sort(qr + 1, qr + m + 1);
    long long l = 1;
    for (long long i = 1; i <= n; i++)
    {
        if (ult[v[i]] != 0)
        {
            upd(1, n, ult[v[i]], -v[i], 1);
        }
        upd(1, n, i, v[i], 1);
        ult[v[i]] = i;
        while (l <= m && qr[l].r <= i)
        {
            ans[qr[l].idx] = query(1, n, qr[l].l, qr[l].r, 1) % mod;
            l++;
        }
    }
    for (long long i = 1; i <= m; i++)
    {
        out << ans[i] << '\n';
    }
    in.close();
    out.close();
    return 0;
}