Cod sursa(job #1426906)

Utilizator justaddcodeJustadd Code justaddcode Data 30 aprilie 2015 21:59:53
Problema Distincte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define zeros(x) ( (x ^ (x - 1)) & x )
#define Nmax 100004
#define mod 666013
using namespace std;
int n, i, j, m, k, v[Nmax], used[Nmax];
int aib[Nmax], sol[Nmax];
struct query
{
    int x;
    int y;
    int z;
} a[Nmax];
int cmp(const query p, const query q)
{
    if (p.y == q.y) return p.x < q.x;
    return p.y < q.y;
}
void add(int x, int y)
{
    int i;
    for (i = x; i <= n; i += zeros(i))
    {
        aib[i] += y;
        if (aib[i] >= mod)
        aib[i] -= mod;
    }
}
int sum(int x)
{
    int i, suma = 0;
    for (i = x; i >= 1; i -= zeros(i))
    {
        suma += aib[i];
        if (suma >= mod)
        suma -= mod;
    }
    return suma;
}
int main()
{
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);
    scanf("%d %d %d", &n, &k, &m);
    for (i = 1; i <= n; ++i)
    scanf("%d", &v[i]);
    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d", &a[i].x, &a[i].y);
        a[i].z = i;
    }
    sort(a + 1, a + m + 1, cmp);
    for (i = 1; i <= m; ++i)
    {
        for (j = a[i - 1].y + 1; j <= a[i].y; ++j)
        {
            if (used[v[j]])
            add(used[v[j]], - v[j]);
            add(j, v[j]);
            used[v[j]] = j;
        }
        sol[a[i].z] = sum(a[i].y) - sum(a[i].x - 1);
        if (sol[a[i].z] < 0)
        sol[a[i].z] += mod;
        if (sol[a[i].z] > mod)
        sol[a[i].z] -= mod;
    }
    for (i = 1; i <= m; ++i)
    printf("%d\n", sol[i]);
    return 0;
}