Cod sursa(job #37990)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 25 martie 2007 13:14:09
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 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 maxf(int a,int b) { 
	if (a>b) return a;
	else return b;
}

int main() {
int i,j,k;
long long sum=0;
	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]);
		if (!used[v[i]]) sum+=v[i];
		used[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;
	}
	ask[0][0]=1;
	ask[0][1]=N;
	for (i=1;i<=M;) {
		if (ask[i-1][1]>ask[i][1]) {
			for (j=ask[i-1][1];j>ask[i][1];--j) { 
				if (used[v[j]]==1)
					sum-=v[j];
				--used[v[j]];
			}
			for (j=ask[i-1][0];j<ask[i][0];++j) { 
				if (used[v[j]]==1)
					sum-=v[j];
				--used[v[j]];
			}
		}
		else {		
				for (j=ask[i-1][1]+1;j<=ask[i][1];++j) { 
					if (used[v[j]]==0)
						sum+=v[j];
					++used[v[j]];
				}

				for (j=ask[i-1][0];j<ask[i][0];++j) { 
					if (used[v[j]]==1)
						sum-=v[j];
					--used[v[j]];
				}
		}
		
		ask[i][3]=sum;
		
		for (j=i+1;ask[j][0]==ask[i][0] && j<=M;++j) {
			for (k=ask[j-1][1]+1;k<=ask[j][1];++k) {
				if (used[v[k]]==0)
					sum+=v[k];
				++used[v[k]];
			}
			ask[j][3]=sum;
		}

		i=j;
	}
	
	qsort(1,M,2);

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

	fclose(stdin); fclose(stdout);

	return 0;
}