Pagini recente » Cod sursa (job #3262230) | Cod sursa (job #2570515) | Cod sursa (job #2982835) | Cod sursa (job #927624) | Cod sursa (job #3223970)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
const int mod = 666013;
const int nmax = 1e5 + 5;
int v[nmax];
int last_pos[nmax];
const int mmax = 1e5 + 5;
int rasp[mmax];
int n,m,k;
struct q_str{
int st,dr,i;
bool operator < (const q_str &other) const {
return dr < other.dr;
}
};
vector<q_str> queries;
int aib[nmax];
void update(int p, int val)
{
if(p == 0) return;
while(p <= n)
{
aib[p] += val;
if(aib[p] > mod) aib[p] -= mod;
if(aib[p] < 0) aib[p] += mod;
p += p & (-p);
}
}
int query(int p)
{
int ret = 0;
while(p > 0)
{
ret += aib[p];
if(ret > mod) ret -= mod;
if(ret < 0) ret += mod;
p -= p & (-p);
}
return ret;
}
void adauga(int i)
{
update(last_pos[v[i]], -v[i]);
last_pos[v[i]] = i;
update(last_pos[v[i]], v[i]);
}
signed main()
{
fin>>n>>k>>m;
for(int i=1; i<=n; i++)
{
fin>>v[i];
}
for(int i=1; i<=m; i++)
{
int a,b; fin>>a>>b;
queries.push_back({a,b,i});
}
sort(queries.begin(),queries.end());
int dr = 1;
for(auto q : queries)
{
while(dr <= q.dr)
{
adauga(dr);
dr++;
}
rasp[q.i] = query(q.dr) - query(q.st - 1);
if(rasp[q.i] < 0) rasp[q.i] += mod;
if(rasp[q.i] > mod) rasp[q.i] -= mod;
}
for(int i=1; i<=m; i++) fout<<rasp[i]<<"\n";
return 0;
}