Cod sursa(job #483042)

Utilizator MirceaTanaseMircea Tanase MirceaTanase Data 6 septembrie 2010 17:38:10
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <algorithm>
#include <stdio.h>

#define MAX 100010
#define restRez 666013
#define bit(x) (x & (x ^ (x - 1)))
#define ll long long
#define mp make_pair
#define f first
#define s second

using namespace std;

int n, k, m;
int a[MAX], urm[MAX], ap[MAX];
ll sum[MAX], sol[MAX];
ll aiSum[4 * MAX];
pair <pair <int, int>, int> q[MAX];

inline void addAi(int nod, int st, int fn, int loc, ll val)
{
	if (st == fn)
	{
		aiSum[nod] += val;

		return;
	}
	
	int med = (st + fn) / 2;
	if (loc <= med)
		addAi(nod * 2, st, med, loc, val);
	else addAi(nod * 2 + 1, med + 1, fn, loc, val);

	aiSum[nod] = aiSum[nod * 2] + aiSum[nod * 2 + 1];
}

inline ll queryAi(int nod, int st, int fn, int qs, int qf)
{
	if (qs <= st && fn <= qf)
		return aiSum[nod];

	int med = (st + fn) / 2;
	ll rez = 0;
	if (qs <= med)
		rez += queryAi(nod * 2, st, med, qs, qf);
	if (med < qf)
		rez += queryAi(nod * 2 + 1, med + 1, fn, qs, qf);

	return rez;
}

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]);

		sum[i] = sum[i - 1];
		if (!ap[a[i]])
			sum[i] = sum[i] + a[i];

		ap[a[i]] = i;
	}

	for (int i = 1; i <= n; i++)
		ap[i] = n + 1;
	for (int i = n; i; i--)
	{
		urm[i] = ap[a[i]];
		
		ap[a[i]] = i;
	}

	for (int i = 1; i <= m; i++)
	{
		scanf("%d %d\n", &q[i].f.f, &q[i].f.s);

		q[i].s = i;
	}

	sort(q + 1, q + 1 + m);

	int r = 1;
	for (int i = 1; i <= m; i++)
	{
		for (; r < q[i].f.f; r++)
			addAi(1, 1, n + 1, urm[r], a[r]);

		sol[q[i].s] = sum[q[i].f.s] - queryAi(1, 1, n + 1, q[i].f.s + 1, n + 1);
	}

	for (int i = 1; i <= m; i++)
		printf("%lld\n", sol[i] % restRez);

	fclose(stdin);
	fclose(stdout);
	return 0;
}