Cod sursa(job #37961)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 25 martie 2007 13:09:57
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#define fin  "distincte.in"
#define fout "distincte.out"
#define Nmax 100001
#define Mod 666013

int N,M,K,v[Nmax],used[Nmax];
int ask[Nmax][4];

inline void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }

void qsort(int st,int dr,int p) {
int i,j,m;
	i=st; j=dr;
	m=ask[(i+j)/2][p];

	do {
		while (ask[i][p]<m) ++i;
		while (ask[j][p]>m) --j;
		if (i<=j) {
			swap(ask[i][0],ask[j][0]);
			swap(ask[i][1],ask[j][1]);
			swap(ask[i][2],ask[j][2]);
			swap(ask[i][3],ask[j][3]);
			++i; --j;
		}
	} while (i<j);
	
	if (i<dr) qsort(i,dr,p);
	if (j>st) qsort(st,j,p);
}

int main() {
int i,j,k,last,sum;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%i%i%i",&N,&K,&M);

	for (i=1;i<=N;++i) 
		scanf("%i",&v[i]);

	for (i=1;i<=M;++i) {
		scanf("%i%i",&ask[i][0],&ask[i][1]);
		ask[i][2]=i;
	}

	qsort(1,M,0);

	for (i=1;i<=M;) {
		j=i;
		while (ask[j][0]==ask[i][0] && j<=M) ++j;
		qsort(i,j-1,1);
		i=j;
	}

	for (i=1;i<=M;) {
		//printf("%i %i %i\n",ask[i][0],ask[i][1],ask[i][2]);
		for (j=1;j<=K;++j) used[j]=0;
		last=ask[i][0];			
		sum=0;
		for (j=i;ask[j][0]==ask[i][0] && j<=M;++j) {
			for (k=last;k<=ask[j][1];++k) {
			       	//fprintf(stderr,"%i ",sum);
				if (!used[v[k]]) {
					used[v[k]]++;
					sum=(sum+v[k]);
				}	
				else 
					used[v[k]]++;
			}
			ask[j][3]=sum;	
			last=ask[j][1]+1;
		}
		i=j;
	}
	
	qsort(1,M,2);

	for (i=1;i<=M;++i)
		printf("%i\n",ask[i][3]);

	fclose(stdin); fclose(stdout);

	return 0;
}