Pagini recente » Cod sursa (job #301667) | Cod sursa (job #987876) | Cod sursa (job #1147683) | Cod sursa (job #2946750) | Cod sursa (job #1235562)
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAXN 100000
#define MOD 666013
using namespace std;
struct Query {
int left, right, pos;
};
Query Q[MAXN + 5];
int N, v[MAXN + 5], loc[MAXN + 5];
long long ans[MAXN + 5], AIB[MAXN + 5];
void update(int pos, int val) {
while(pos <= N) {
AIB[pos] += val;
pos += (pos & (-pos));
}
}
int query(int pos){
int ans = 0;
while(pos > 0) {
ans += AIB[pos];
pos -= (pos & (-pos));
}
return ans;
}
bool cmp (Query a, Query b) {
if(a.right == b.right)
return a.left < b.left;
return a.right < b.right;
}
int main()
{
ifstream cin("distincte.in");
ofstream cout("distincte.out");
int K, M;
cin >> N >> K >> M;
for(int i = 1; i <= N; ++i) {
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= M; ++i) {
cin >> Q[i].left >> Q[i].right;
Q[i].pos = i;
}
sort(Q + 1, Q + M + 1, cmp);
int p = 0;
for(int i = 1; i <= M; ++i) {
while(p < Q[i].right) {
++p;
if(loc[v[p]]) {
update(loc[v[p]], -v[p]);
}
loc[v[p]] = p;
}
ans[Q[i].pos] = query(Q[i].right) - query(Q[i].left - 1);
}
for(int i = 1; i <= M; ++i) {
cout << ans[i] % MOD << '\n';
}
return 0;
}