Pagini recente » Cod sursa (job #2486609) | Istoria paginii runda/concurs65652 | Cod sursa (job #257712) | Cod sursa (job #696800) | Cod sursa (job #1426907)
#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 suma = 0, i;
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;
}