Pagini recente » Cod sursa (job #542633) | Cod sursa (job #2625150) | Cod sursa (job #587093) | Cod sursa (job #1997646) | Cod sursa (job #1729682)
#include <fstream>
#include <algorithm>
using namespace std;
typedef struct segm {int st,dr,nro; long long suma;} SEGM;
ifstream cin("distincte.in");
ofstream cout("distincte.out");
int N,K,M,i,j;
int V[100001];
int PRED[100001];
int U[100001];
SEGM S[100001];
int F[100001];
int righ;
void update(int poz, int v)
{
while (poz<=N)
{
F[poz]+=v;
poz=poz+(poz&(-poz));
}
}
int f(int poz)
{
int rez=0;
while (poz>=1)
{
rez=rez+F[poz];
poz=poz-(poz&(-poz));
}
return rez;
}
int query(int st, int dr)
{
return f(dr)-f(st-1);
}
void actualizare(int poz, int v)
{
if (PRED[poz]==0)
update(poz,v);
else
{
update(PRED[poz],-v);
update(poz,v);
}
}
int cmp(SEGM s1, SEGM s2)
{
if (s1.dr<s2.dr)
return 1;
return 0;
}
int cmpnro(SEGM s1, SEGM s2)
{
if (s1.nro<s2.nro)
return 1;
return 0;
}
int main()
{
cin>>N>>K>>M;
for (i=1;i<=N;i++)
cin>>V[i];
// se determina sirul PRED
for (i=1;i<=N;i++)
if (U[V[i]]==0)
{
U[V[i]]=i;
PRED[i]=0;
}
else
{
PRED[i]=U[V[i]];
U[V[i]]=i;
}
for (i=1;i<=M;i++)
{
cin>>S[i].st>>S[i].dr;
S[i].nro=i;
S[i].suma=0;
}
sort(S+1,S+M+1,cmp);
righ=0;
for (i=1;i<=M;i++)
{
for (j=max(righ+1,S[i].st);j<=S[i].dr;j++)
actualizare(j,V[j]);
S[i].suma=query(S[i].st,S[i].dr);
righ=S[i].dr;
}
// se reordoneaza intervalele dupa nro
sort(S+1,S+M+1,cmpnro);
for (i=1;i<=M;i++)
cout<<S[i].suma<<"\n";
cin.close();
cout.close();
return 0;
}