Cod sursa(job #81871)

Utilizator gigi_becaliGigi Becali gigi_becali Data 4 septembrie 2007 20:43:39
Problema Distincte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
using namespace std;
#include <cstdio>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
#define maxn 100001

vector<set<int> > H;

int a[maxn];
int N, K, M;
int A, B;
set<int>sol;
void build(int n, int l, int r)
{
	if(l==r) { H[n].insert(a[l]);return;}
	
	int m=(l+r)>>1;
	build(n<<1, l,m);
	build((n<<1)|1, m+1, r);
	int lf=n<<1, rt=(n<<1)|1;
	//H[n]=set_union(H[n<<1].begin(), H[n<<1].end(), H[(n<<1)|1].begin(), H[(n<<1)|1].end());
	set<int>::iterator i;
	for(i=H[lf].begin();i!=H[lf].end();++i) H[n].insert(*i);
	for(i=H[rt].begin();i!=H[rt].end();++i) H[n].insert(*i);
	//printf("%d\n",n);
	//for(i=H[n].begin();i!=H[n].end();++i) printf("%d ", *i);
	//printf("\n");
}
void read()
{
	freopen("distincte.in","r",stdin);
	scanf("%d %d %d\n", &N, &K, &M);
	H.resize(3*N);
	int i;
	char x[32], *p;
	for(i=1;i<=N;++i){gets(x); p=strtok(x, " \n"); a[i]=atoi(p);}
	
	build(1, 1, N);
}

void query(int n, int l, int r)//A, B
{
	if(A<=l && r<=B)
	{
		for(set<int>::iterator it=H[n].begin();it!=H[n].end();++it)sol.insert(*it);
	return ;
	}
	int m=(l+r)>>1;
	if(A<=m) query(n<<1, l, m);
	if(B>m) query((n<<1)|1, m+1, r);
	
}

int main()
{
	freopen("distincte.out","w",stdout);
	read();
	char x[32], *p;
	int sum;
	while(M--)
	{
		
		gets(x);
		p=strtok(x, " ");
		A=atoi(p);
		p=strtok(0, " \n");
		B=atoi(p);
		sol.clear();
		query(1, 1, N);
		sum=0;
		for(set<int>::iterator it=sol.begin();it!=sol.end();++it)sum+=*it;//printf("%d ", *it);
		printf("%d\n", sum);
	}
	
	
	return 0;
}