Pagini recente » Cod sursa (job #2260803) | Cod sursa (job #2083892) | Cod sursa (job #2256178) | Cod sursa (job #267796) | Cod sursa (job #2139628)
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
typedef struct Q
{
int st;
int dr;
int poz;
} QQ;
int n,mst,mdr,m,k;
int A[100010];
QQ B[100010];
int F[100010];
int R[100010];
int BL_size;
bool cmp(QQ a,QQ b)
{
if (a.st/BL_size < b.st/BL_size)
return 1;
else if (a.st/BL_size == b.st/BL_size && a.dr<b.dr)
return 1;
return 0;
}
long long rez;
void add(int x)
{
if (F[x]==0)
{
rez+=x;
rez%=666013;
}
F[x]++;
}
void rem(int x)
{
if (F[x]==1)
{
rez-=x;
rez%=666013;
}
F[x]--;
}
int main()
{
fin>>n>>k>>m;
BL_size=sqrt(n);
for (int i=1; i<=n; i++)
fin>>A[i];
for (int i=1; i<=m; i++)
{
fin>>B[i].st>>B[i].dr;
B[i].poz=i;
}
sort(B+1,B+m+1,cmp);
mst=1;
mdr=0;
for (int i=1; i<=m; i++)
{
while (mdr<B[i].dr)
{
mdr++;
add(A[mdr]);
}
while (mdr>B[i].dr)
{
rem(A[mdr]);
mdr--;
}
while (mst>B[i].st)
{
mst--;
add(A[mst]);
}
while (mst<B[i].st)
{
rem(A[mst]);
mst++;
}
R[B[i].poz]=rez;
}
for (int i=1;i<=m;i++)
fout<<R[i]<<"\n";
return 0;
}