Cod sursa(job #228001)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 6 decembrie 2008 09:14:48
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int N, ult[100005], arb[300005], v[100005], u[100005], M, K, sum, val, pos, rez[100005];

struct queue
{
	int x, y, p;
} a[100005];

int cmp(struct queue x, struct queue y)
{
	return x.y < y.y;
}

void update(int nod, int st, int dr)
{
	int m = (st + dr) / 2;

	if (st == dr)
	{
		arb[nod] = val;
	}
	else
	{
		if (pos <= m) update(2 * nod, st, m);
		else if (pos > m) update(2 * nod + 1, m + 1, dr);

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

void query(int nod, int st, int dr, int l, int r)
{
	int m = (st + dr) / 2;
	if (l <= st && dr <= r)
	{
		sum += arb[nod];
	}
	else
	{
		if (l <= m) query(2 * nod, st, m, l, r);
		if (r > m) query(2 * nod + 1, m + 1, dr, l, r);
	}
}

int main()
{
	freopen("distincte.in","r",stdin);
	freopen("distincte.out","w",stdout);

	int i, j;
	scanf("%d %d %d",&N,&K,&M);
	for (i = 1; i <= N; i++)
	{
		scanf("%d",&v[i]);
		ult[i] = u[v[i]];
		u[v[i]] = i;
		val = v[i]; pos = i;
		update(1,1,N);
	}

	for (i = 0; i < M; i++)	
	{
		scanf("%d %d",&a[i].x,&a[i].y);
		a[i].p = i;
	}
	sort(a, a + M, cmp);

	i = 0;
	for (j = 0; j < M; j++)
	{
		while (i < a[j].y)
		{
			i++;			
			if (ult[i] != 0)
			{
				val = 0; pos = ult[i];
				update(1,1,N);
			}			
		}
		sum = 0;
		query(1,1,N,a[j].x,a[j].y);
		rez[a[j].p] = sum;
	}
	for (i = 0; i < M; i++) printf("%d\n",rez[i]);
	return 0;
}