Pagini recente » Cod sursa (job #19841) | Cod sursa (job #2969501) | Cod sursa (job #366645) | Cod sursa (job #1172152) | Cod sursa (job #2140246)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("distincte.in");
ofstream fout ("distincte.out");
#define lim 100010
int n,k,m,bucket;
int fr[lim],ini[lim];
struct intrebare {int st,dr,ind;} q[lim];
int nrb, moL, moR, L, R, answer;
int sol[lim];
bool cmp (intrebare A, intrebare B)
{
if (A.st/bucket != B.st/bucket) return (A.st/bucket) < (B.st/bucket);
return A.dr < B.dr;
}
void adauga (int val)
{
fr[val]++;
if (fr[val]==1) answer+=val;
}
void sterge (int val)
{
fr[val]--;
if (fr[val]==0) answer-=val;
}
int main()
{
fin>>n>>k>>m;
for (int i=1; i<=n; i++) fin>>ini[i];
bucket = (int)sqrt(n);
for (int i=1; i<=m; i++)
{
fin>>q[i].st>>q[i].dr;
q[i].ind=i;
}
sort (q+1, q+m+1, cmp);
moL=0, moR=0, answer=0;
for (int i=1; i<=m; i++)
{
L=q[i].st, R=q[i].dr;
while (moR<R)
{
moR++;
adauga (ini[moR]);
}
while (moR>R)
{
sterge (ini[moR]);
moR--;
}
while (moL<L)
{
sterge (ini[moL]);
moL++;
}
while (moL>L)
{
moL--;
adauga (ini[moL]);
}
sol[q[i].ind] = answer;
}
for (int i=1; i<=m; i++) fout<<sol[i]<<'\n';
fout.close();
return 0;
}