Cod sursa(job #1538722)

Utilizator akaprosAna Kapros akapros Data 29 noiembrie 2015 17:51:47
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 100002
#define mod 666013
using namespace std;
int n, i, j, m, k, v[maxN], used[maxN], sol[maxN], arb[maxN * 4];
struct Query
{
    int x;
    int y;
    int z;
} a[maxN];
inline void update(int node, int l, int r, int p, int val)
{
    if (l > r)
        return;
    if (l == r)
    {
        arb[node] = val % mod;
        return ;
    }
    int lson = 2 * node, rson = lson + 1, mid = (l + r) >> 1;
    if (p <= mid)
        update(lson, l, mid, p, val);
    else
        update(rson, mid + 1, r, p, val);
    arb[node] = (arb[lson] + arb[rson]) % mod;
}
inline int query(int node, int l, int r, int x, int y)
{
    if (l > r)
        return 0;
    if (l >= x && r <= y)
        return arb[node];
    int lson = 2 * node, rson = lson + 1, mid = (l + r) >> 1;
    if (y <= mid)
        return query(lson, l, mid, x, y);
    else
    {
        if (x > mid)
            return query(rson, mid + 1, r, x, y);
        else
            return (query(lson, l, mid, x, mid) + query(rson, mid + 1, r, mid + 1, y)) % mod;
    }

    return 0;
}
int cmp(const Query p, const Query q)
{
    return p.y < q.y;
}
void read()
{
    freopen("distincte.in", "r", stdin);
    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;
    }
}
void solve()
{
    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]])
                update(1, 1, n, used[v[j]], 0);
            update(1, 1, n, j, v[j]);
            used[v[j]] = j;
        }
        sol[a[i].z] = query(1, 1, n, a[i].x, a[i].y);
    }
}
void write()
{
    freopen("distincte.out", "w", stdout);
    for (i = 1; i <= m; ++ i)
        printf("%d\n", sol[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}