Pagini recente » Cod sursa (job #649679) | Cod sursa (job #209448) | Cod sursa (job #523908) | Cod sursa (job #2711888) | Cod sursa (job #525448)
Cod sursa(job #525448)
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010
int n, k, m, t[nmax], p[nmax], v[nmax];
long long aib[nmax], s[nmax];
struct nr
{
int x, y, p;
long long r;
} q[nmax];
int cmp(nr a, nr b)
{
return a.x<b.x;
}
int cmp2(nr a, nr b)
{
return a.p<b.p;
}
void update(int poz, int val)
{
while (poz<=n+1)
{
aib[poz]+=val;
poz += (poz^(poz-1))&poz;
}
}
long long query(int poz)
{
long long s=0;
while (poz>0)
{
s+=aib[poz];
poz -= (poz^(poz-1))&poz;
}
return s;
}
int main()
{
freopen("distincte.in","r",stdin);
freopen("distincte.out","w",stdout);
scanf("%d %d %d",&n,&k,&m);
int i, c, j;
for (i=1; i<=n; i++)
{
scanf("%d",&v[i]);
s[i]=s[i-1]+v[i];
}
for (i=1; i<=k; i++) p[i]=n+1;
for (i=n; i>0; i--)
{
t[i]=p[v[i]];
p[v[i]]=i;
}
for (i=1; i<=n; i++) update(t[i], v[i]);
for (i=1; i<=m; i++)
{
scanf("%d %d",&q[i].x, &q[i].y);
q[i].p=i;
}
sort(q+1, q+m+1, cmp);
c=1;
for (i=1; i<=m; i++)
{
for (; c<q[i].x; c++) update(t[c], -v[c]);
q[i].r=s[q[i].y]-s[q[i].x-1]-query(q[i].y);
}
sort(q+1, q+m+1, cmp2);
for (i=1; i<=m; i++) printf("%lld\n",q[i].r);
}