Pagini recente » Cod sursa (job #2207166) | Cod sursa (job #2969668) | Monitorul de evaluare | Cod sursa (job #1348964) | Cod sursa (job #425430)
Cod sursa(job #425430)
#include <stdio.h>
#include <algorithm>
#define IN "distincte.in"
#define OUT "distincte.out"
#define Lg 100010
using namespace std;
struct pct
{
int St,Dr,ind;
}Q[Lg];
struct cmp
{
bool operator()(const pct &a, const pct &b )const
{
return a.St<b.St;
}
};
int ap[Lg],rez[Lg],sir[Lg];
int S,n,m,k;
void citire()
{
scanf ("%d %d %d",&n,&k,&m);
for (int i=1;i<=n;i++)
scanf ("%d ",&sir[i]);
for (int i=0;i<m;i++)
{
scanf ("%d %d",&Q[i].St,&Q[i].Dr);
Q[i].ind=i;
}
sort(Q,Q+m,cmp());
}
void solve()
{
S=0;
for (int i=Q[0].St;i<=Q[0].Dr;i++)
{
ap[sir[i]]++;
if (ap[sir[i]]==1)
S+=sir[i];
}
rez[Q[0].ind]=S;
for (int i=1;i<m;i++)
{
for (int j=Q[i-1].St;j<Q[i].St;j++)
{
ap[sir[j]]--;
if (ap[sir[j]]==0)
S-=sir[i];
}
if (Q[i].Dr>Q[i-1].Dr)
for (int j=Q[i-1].Dr+1;j<=Q[i].Dr;j++)
{
ap[sir[j]]++;
if (ap[sir[j]]==1)
S+=sir[j];
}
else
{
for (int j=Q[i-1].Dr;j>Q[i].Dr;j--)
{
ap[sir[j]]--;
if (ap[sir[j]]==0)
S-=sir[i];
}
}
rez[Q[i].ind]=S;
}
for (int i=0;i<m;i++)
printf("%d\n",rez[i]);
}
int main ()
{
freopen (IN ,"r", stdin);
freopen (OUT ,"w", stdout);
citire();
solve();
return 0;
}