Pagini recente » Cod sursa (job #1637898) | Istoria paginii runda/simulare_oji_2023_clasa_9_13_martie/clasament | Cod sursa (job #1862114) | Istoria paginii runda/simulare_oji_2023_clasele_11_12_11_martie | Cod sursa (job #658271)
Cod sursa(job #658271)
#include <cstdio>
#include <algorithm>
#include <vector>
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define ll long long
using namespace std;
const int maxn = 100005;
const int mod = 666013;
int n, m, k;
int A[maxn], sol[maxn], last[maxn];
ll aib[maxn];
vector <pair <int, pair <int, int> > > Q;
inline void update(int poz, int val) {
if(poz == 0) return ;
for(; poz <= n; poz += (poz & -poz)) {
aib[poz] = aib[poz] + val;
}
}
inline int query(int poz) {
ll ret = 0;
for(; poz > 0; poz -= (poz & -poz)) {
ret = ret + aib[poz];
}
return ret % mod;
}
int main() {
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
scanf("%d%d%d\n", &n, &k, &m);
for(int i = 1; i <= n; i++)
scanf("%d\n", &A[i]);
for(int i = 1; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
Q.pb(mp(y, mp(x, i)));
}
sort(Q.begin(), Q.end());
for(int i = 0, j = 1; i < m; i++) {
for(; j <= Q[i].f; j++) {
update(last[A[j]], -A[j]);
update(j, A[j]);
last[A[j]] = j;
}
sol[Q[i].s.s] = query( Q[i].f)- query( Q[i].s.f - 1);
while(sol[Q[i].s.s] < 0) sol[Q[i].s.s] += mod;
}
for(int i = 1; i <= m; i++)
printf("%d\n", sol[i]);
return 0;
}