Pagini recente » Cod sursa (job #990945) | Cod sursa (job #2055918) | Cod sursa (job #2040936) | Cod sursa (job #2140239) | Cod sursa (job #784725)
Cod sursa(job #784725)
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
using namespace std;
#define NMAX 100015
#define left_son(nod) ((nod)<<1)
#define right_son(nod) (((nod)<<1)+1)
vector < short int unsigned > SegT[NMAX];
bitset <NMAX> SegT2[NMAX];
char S[NMAX];
long long Sol;
int N,M,K,nr,poz,A,B;
void update(int nod, int left, int right)
{
if(left==right)
{
if(SegT2[nod][nr]==0)
{
SegT[nod].push_back(nr);
SegT2[nod][nr]=1;
}
return;
}
int mid;
mid=left+(right-left)/2;
if(poz<=mid)
update(left_son(nod),left,mid);
else
update(right_son(nod),mid+1,right);
if(SegT2[nod][nr]==0)
{
SegT[nod].push_back(nr);
SegT2[nod][nr]=1;
}
}
void query(int nod, int left, int right)
{
if(A<=left && right<=B)
{
for(unsigned i=0;i<SegT[nod].size();i++)
if(S[SegT[nod][i]]==48)
{
Sol+=SegT[nod][i];
S[SegT[nod][i]]=1;
}
return;
}
int mid;
mid=left+(right-left)/2;
if(A<=mid)
query(left_son(nod),left,mid);
if(mid<B)
query(right_son(nod),mid+1,right);
}
int main()
{
freopen("distincte.in","r",stdin);
freopen("distincte.out","w",stdout);
scanf("%d %d %d",&N,&K,&M);
int i;
for(i=1;i<=N;i++)
{
scanf("%d",&nr);
poz=i;
update(1,1,N);
}
for(i=1;i<=M;i++)
{
memset(S,'0',sizeof(S));
scanf("%d %d",&A,&B);
query(1,1,N);
printf("%lld\n",Sol);
Sol=0;
}
return 0;
}