Pagini recente » Cod sursa (job #2417995) | Cod sursa (job #2059307) | Cod sursa (job #1908930) | Cod sursa (job #1758113) | Cod sursa (job #81871)
Cod sursa(job #81871)
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;
}