Cod sursa(job #37941)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 25 martie 2007 13:07:48
Problema Distincte Scor 15
Compilator c Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#define NMAX 100100
#define TMAX (1<<17)

int N, K, M, V[NMAX], S[NMAX], A[NMAX], Cnt[NMAX], Last[NMAX], T[2*TMAX], X, Y, Sum;

void update(int p1, int p2, int nod, int sum)
{
        int mij  = (p1+p2)/2;

        if (X <= p1 && p2 <= Y)
        {
                T[nod] += sum;
                return;
        }
        if ( (p1 <= X && X <= p2) || (p1 <= Y && Y <= p2) )
        {
                update(p1, mij, 2*nod, sum);
                update(mij+1, p2, 2*nod+1, sum);
        }
}

void query(int p1, int p2, int nod)
{
        int mij  = (p1+p2)/2;

        if (X <= p1 && p2 <= Y)
        {
                Sum += T[nod];
                return;
        }
        if ( (p1 <= X && X <= p2) || (p1 <= Y && Y <= p2) )
        {
                query(p1, mij, 2*nod);
                query(mij+1, p2, 2*nod+1);
        }
}

int main()
{
        int i, j, k , sum = 0;

        freopen("distincte.in", "r", stdin);
        scanf("%d %d %d", &N, &K, &M);

        for (i = 1; i <= N; ++i)
        {
                scanf("%d", V+i);
                S[i] = S[i-1]+V[i];
                Cnt[ V[i] ]++;
                A[i] = A[i-1]+V[i]*(Cnt[ V[i] ]>1);
                if (Last[ V[i] ] > 0)
                {
                        X = Last[ V[i] ]+1; Y = i-1;
                        if (X <= Y) update(0, TMAX-1, 1, V[i]);
                }
                Last[ V[i] ] = i;
        }

        if (N*N*M <= 50000000)
        {
            freopen("distincte.out", "w", stdout);
            while (M--)
            {
                    sum = 0;
                    scanf("%d %d", &i, &j);
                    for (k = 1; k <= K; k++) Cnt[k] = 0;
                    for (k = i; k <= j; k++) Cnt[ V[k] ] = 1;
                    for (k = 1; k <= K; k++) sum += (k*Cnt[k]);
                    printf("%d\n", sum);
            }
            return 0;
        }

        freopen("distincte.out", "w", stdout);
        while (M--)
        {
                scanf("%d %d", &j, &i);
                Sum = 0;
                X = j; Y = i;
                query(0, TMAX-1, 1);
                printf("%d\n", S[i]-S[j-1]-A[i+1]+A[j]+Sum);
        }

        return 0;
        
}