Pagini recente » Cod sursa (job #2369341) | Cod sursa (job #2467494) | Cod sursa (job #425114) | Cod sursa (job #1964786) | Cod sursa (job #2415011)
#include <bits/stdc++.h>
#define Nmax 100000
#define MOD 666013
#define lsb(x) (x&(-x))
using namespace std;
ifstream fin ("distincte.in");
ofstream fout ("distincte.out");
struct Question
{
int left, right, index;
bool operator < (const Question &Other)
{
return right < Other.right;
}
};
int N, M, K;
Question Q[Nmax + 5];
int A[Nmax + 5];
long long AIB[Nmax + 5];
long long Answers[Nmax + 5];
int Positions[Nmax + 5];
int j = 1;
long long sum = 0;
inline void update (int poz, int val);
inline long long query (int poz);
int main()
{
fin >> N >> K >> M;
for (int i = 1; i <= N; ++i)
fin >> A[i];
for (int i = 1; i <= M; ++i)
{
fin >> Q[i].left >> Q[i].right;
Q[i].index = i;
}
sort (Q + 1, Q + M + 1);
for (int i = 1; i <= M; ++i)
{
while (j <= Q[i].right)
{
update (j, A[j]);
sum += A[j];
if (Positions[A[j]])
{
update (Positions[A[j]], -A[j]);
sum -= A[j];
}
Positions[A[j]] = j;
++j;
}
Answers[Q[i].index] = (sum - query (Q[i].left - 1)) % MOD;
}
for (int i = 1; i <= M; ++i)
fout << Answers[i] << "\n";
return 0;
}
void update (int poz, int val)
{
while (poz <= N)
{
AIB[poz] += val;
poz += lsb (poz);
}
}
long long query (int poz)
{
long long ans = 0;
while (poz)
{
ans = (ans + AIB[poz]) % MOD;
poz -= lsb (poz);
}
return ans;
}