Cod sursa(job #41052)

Utilizator TYTUSVlad Saveluc TYTUS Data 27 martie 2007 22:06:27
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100001;
const int MOD = 666013;

class query {
	public:
	int l, r, i;
	query() {
	}
}q[NMAX];

inline bool cmpQ(query a, query b) {
	return a.r > b.r ? 1 : 0;
}

int v[NMAX], next[NMAX], lastPos[NMAX], order[NMAX], N, K, M;
int ans[NMAX]; //Raspunsul la query-uri

inline bool cmp(int a, int b) {
	return next[a] > next[b] ? 1 : 0;
}

int aib[4 * NMAX];
void add(int a, int val, int nod, int l, int r) { //Adauga in AIB
	if (l > r) return;
	if (a < l || a > r) return;
	aib[nod] += val;
	if (aib[nod] >= MOD) {
		aib[nod] -= MOD;
	}
	if (l != r) {
		add(a, val, nod<<1, l, (l + r)>>1);
		add(a, val, (nod<<1) + 1, ((l + r)>>1) + 1, r);
	}
}

int ask(int st, int dr, int nod, int l, int r) {
	if (dr < l || st > r) return 0;
	if (st <= l && dr >= r) return aib[nod];
	return (ask(st, dr, nod<<1, l, (l + r)>>1) + ask(st, dr, (nod<<1) + 1, ((l + r)>>1) + 1, r)) % MOD;
}

	
int main() {
	FILE *fin = fopen("distincte.in", "r");
	FILE *fout = fopen("distincte.out", "w");
	fscanf (fin, "%d %d %d", &N, &K, &M);
	int i;
	for (i = 1; i <= N; ++i) {
		fscanf (fin, "%d", &v[i]);
	}
	for (i = 1; i <= M; ++i) {
		fscanf (fin, "%d %d", &q[i].l, &q[i].r);
		q[i].i = i;
	}
	sort(q + 1, q + M + 1, cmpQ);
	for (i = 1; i <= K; ++i) {
		lastPos[i] = N + 1;
	}
	for (i = N; i; i--) {
		next[i] = lastPos[v[i]];
// 		printf ("Next %d = %d\n", i, next[i]);
		lastPos[v[i]] = i;
		order[i] = i;
	}
	sort(order + 1, order + N + 1, cmp);
// 	printf ("Am sortat dupa NEXT\n");
	int ii = 1;
	for (i = 1; i <= M; ++i) {
// 		printf ("I = %d\n", i);
		for (;ii <= N && next[order[ii]] > q[i].r; ii++) { //Adaug nodurile care sunt distincte
			add(order[ii], v[order[ii]], 1, 1, N);
		}
		//
		ans[q[i].i] = ask(q[i].l, q[i].r, 1, 1, N);
	}
// 	printf ("Aici\n");
	for (i = 1; i <= M; ++i) {
		fprintf (fout, "%d\n", ans[i]);
	}
	fclose(fout);
	return 0;
}