Pagini recente » Cod sursa (job #2831531) | Cod sursa (job #1101059) | Cod sursa (job #2028983) | Cod sursa (job #260577) | Cod sursa (job #2831756)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
const int NMAX = 100000;
int N, K, M;
int v[NMAX + 5];
int ans[NMAX + 5];
int frecv[NMAX + 5];
struct elem
{
int idx, l, r, sqrt_idx;
bool operator < (const elem &other) const
{
if(sqrt_idx != other.sqrt_idx)
{
return make_pair(l, r) < make_pair(other.l, other.r);
}
if(sqrt_idx & 1)
{
return r < other.r;
}
else
{
return r > other.r;
}
}
};
elem ask[NMAX + 5];
signed main()
{
fin >> N >> K >> M;
for(int i = 1; i <= N; i ++)
{
fin >> v[i];
}
const int block = sqrt(N);
for(int i = 1; i <= M; i ++)
{
fin >> ask[i].l >> ask[i].r;
ask[i].idx = i;
ask[i].sqrt_idx = ask[i].l / block;
}
sort(ask + 1, ask + M + 1);
int suma = 0;
for(int i = ask[1].l; i <= ask[1].r; i ++)
{
if(frecv[v[i]] == 0)
{
suma += v[i];
}
frecv[v[i]] ++;
}
ans[ask[1].idx] = suma;
int st = ask[1].l, dr = ask[1].r;
for(int i = 2; i <= M; i ++)
{
while(st > ask[i].l)
{
st--;
if(frecv[v[st]] == 0)
{
suma += v[st];
}
frecv[v[st]]++;
}
while(st < ask[i].l)
{
if(frecv[v[st]] == 1)
{
suma -= v[st];
}
frecv[v[st]] ++;
st ++;
}
while(dr < ask[i].r)
{
dr++;
if(frecv[v[dr]] == 0)
{
suma += v[dr];
}
frecv[v[dr]] ++;
}
while(dr > ask[i].r)
{
if(frecv[v[dr]] == 1)
{
suma -= v[dr];
}
frecv[v[dr]]--;
dr--;
}
ans[ask[i].idx] = suma;
}
for(int i = 1; i <= M; i ++)
{
fout << ans[i] << '\n';
}
fout << '\n';
return 0;
}