Cod sursa(job #784723)

Utilizator gabrielvGabriel Vanca gabrielv Data 6 septembrie 2012 19:44:05
Problema Distincte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#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;
}