Pagini recente » Cod sursa (job #180644) | Cod sursa (job #765069) | Cod sursa (job #1470787) | Cod sursa (job #2205379) | Cod sursa (job #3268320)
#include <bits/stdc++.h>
#define mod 666013
using namespace std;
ifstream fcin("distincte.in");
ofstream fcout("distincte.out");
int r = 316;
int aib[100005], fr[100005], v[100005], n, m, k;
long long suma;
/**
6 3 2
1 2 2 1 3 1
1 4
2 5
*/
struct Interogare
{
int a, b, ind, sol;
} q[100005];
bool comp1(Interogare a, Interogare b)
{
if (a.a / r == b.a / r)
return a.b < b.b;
return a.a / r < b.a / r;
}
bool comp2(Interogare a, Interogare b)
{
return a.ind < b.ind;
}
int main()
{
int st, dr, x;
fcin >> n >> k >> m;
for (int i = 1; i <= n; i++)
fcin >> v[i];
for (int i = 1; i <= m; i++)
{
fcin >> q[i].a >> q[i].b;
q[i].ind = i;
}
sort(q + 1, q + m + 1, comp1);
st = q[1].a;
dr = q[1].b;
for (int i = st; i <= dr; i++)
{
x = v[i];
if (fr[x] == 0)
suma += x;
fr[x]++;
}
q[1].sol = suma % mod;
for (int j = 2; j <= m; j++)
{
while (st < q[j].a)
{
x = v[st];
fr[x]--;
if (fr[x] == 0)
suma -= x;
st++;
}
while (st > q[j].a)
{
st--;
x = v[st];
if (fr[x] == 0)
suma += x;
fr[x]++;
}
while (dr < q[j].b)
{
dr++;
x = v[dr];
if (fr[x] == 0)
suma += x;
fr[x]++;
}
while (dr > q[j].b)
{
x = v[dr];
fr[x]--;
if (fr[x] == 0)
suma -= x;
dr--;
}
q[j].sol = suma % mod;
}
sort(q + 1, q + m + 1, comp2);
for (int i = 1; i <= m; i++)
fcout << q[i].sol << '\n';
return 0;
}