Pagini recente » Cod sursa (job #1544284) | Cod sursa (job #533080) | Cod sursa (job #1183763) | Cod sursa (job #1213330) | Cod sursa (job #39719)
Cod sursa(job #39719)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 100005
#define Amax 262145
#define mod 666013
#define y first
#define x second.first
#define z second.second
int n, k, m, a, b, vl;
pair<int, pair<int, int> > inv[Nmax];
int ai[Amax], prev[Nmax], sir[Nmax], p[Nmax];
void citire()
{
int i;
scanf("%d %d %d\n", &n, &k, &m);
for (i = 1; i <= n; ++i)
scanf("%d\n", &sir[i]);
for (i = 1; i <= m; ++i)
{
scanf("%d %d\n", &inv[i].x, &inv[i].y);
inv[i].z = i;
}
}
void update(int nod, int st, int dr)
{
if (a <= st && dr <= b)
{
ai[nod] += vl;
if (ai[nod] >= mod)
ai[nod] -= mod;
}
else
{
int mij = (st + dr) / 2;
if (a <= mij)
update(nod * 2, st, mij);
if (mij < b)
update(nod * 2 + 1, mij + 1, dr);
}
}
int query(int nod, int st, int dr)
{
if (st == dr)
return ai[nod];
else
{
int mij = (st + dr) / 2, ret = ai[nod];
if (a <= mij)
ret += query(nod * 2, st, mij);
else
ret += query(nod * 2 + 1, mij + 1, dr);
if (ret >= mod)
ret -= mod;
return ret;
}
}
void solve()
{
int i, ind = 0;
sort(inv + 1, inv + m + 1);
for (i = 1; i <= m; ++i)
{
while (ind < inv[i].y)
{
++ind;
a = prev[sir[ind]] + 1;
b = ind;
vl = sir[ind];
update(1, 1, n);
prev[sir[ind]] = ind;
}
a = inv[i].x;
p[inv[i].z] = query(1, 1, n);
}
for (i = 1; i <= m; ++i)
printf("%d\n", p[i]);
}
int main()
{
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
citire();
solve();
return 0;
}