Cod sursa(job #1426326)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 29 aprilie 2015 14:26:04
Problema Distincte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>

#define f first
#define s second
#define MOD 666013

using namespace std;

int v[100010], aib[100010], prv[100010], sol[100010], n, k, m;
pair < pair <int, int>, int> q[100010];

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

inline long long querry (int poz)
{
    long long sum = 0LL;
    for (int i = poz; i; i -= i & (-i))
        sum += 1LL * aib[i];

    return 1LL * sum;
}

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

    scanf ("%d %d %d", &n, &k, &m);

    for (int i = 1; i <= n; ++i)
        scanf ("%d", &v[i]);

    for (int i = 1; i <= m; ++i)
    {
        scanf ("%d %d", &q[i].f.s, &q[i].f.f);
        q[i].s = i;
    }

    sort (q + 1, q + m + 1);

    int nr = 1;
    for (int i = 1; i <= n; ++i)
    {
        if (prv[v[i]]) add (prv[v[i]], -v[i]);
        add (i, v[i]);
        prv[v[i]] = i;

        if (q[nr].f.f == i)
        {
            sol[q[nr].s] = (int)(1LL * (querry (q[nr].f.f) - querry (q[nr].f.s - 1)) % MOD);
            ++nr;
        }
    }

    for (int i = 1; i <= m; ++i)
        printf ("%d\n", sol[i]);

    return 0;
}