Pagini recente » Cod sursa (job #1208512) | Cod sursa (job #301428) | Cod sursa (job #2906486) | Cod sursa (job #2905643) | Cod sursa (job #1782007)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 100050
using namespace std;
struct query
{
int ind, st, dr;
bool operator()(query e, query f)
{
return e.dr > f.dr;
}
};
struct data
{
int val, x, y;
bool operator()(data e, data f)
{
return e.y > f.y;
}
};
int a[MAXN], sol[MAXN], n, k, m;
query q[MAXN];
int urmv[MAXN], urmi[MAXN], aib[MAXN];
data d[MAXN];
void prepare()
{
for (int i = n; i >= 1; i--) {
if (urmv[a[i]] == 0)
urmi[i] = n+1;
else
urmi[i] = urmv[a[i]];
urmv[a[i]] = i;
}
for (int i = 1; i <= n; i++)
{
d[i].val = a[i];
d[i].x = i;
d[i].y = urmi[i];
}
sort(d+1, d+n+1, data());
sort(q+1, q+m+1, query());
}
void add(data e)
{
for (int i = e.x; i < MAXN; i += i&(-i))
aib[i] += e.val;
}
int get(int dr)
{
int to = 0;
for (int i = dr; i > 0; i -= (i&(-i)))
to += aib[i];
return to;
}
int get(int st, int dr)
{
return get(dr) - get(st-1);
}
void solve()
{
int di = 1;
for (int i = 1; i <= m; i++) {
while (di <= n && d[di].y > q[i].dr) {
add(d[di]);
di++;
}
sol[q[i].ind] = get(q[i].st, q[i].dr);
}
}
int main()
{
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
scanf("%d %d %d", &n, &k, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= m; i++)
{
scanf("%d %d", &q[i].st, &q[i].dr);
q[i].ind = i;
}
prepare();
solve();
for (int i = 1; i <= m; i++)
printf("%d\n", sol[i]);
return 0;
}