Cod sursa(job #425430)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 25 martie 2010 18:52:12
Problema Distincte Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <algorithm>
#define IN "distincte.in"
#define OUT "distincte.out"
#define Lg 100010

using namespace std;

struct pct
{
    int St,Dr,ind;
}Q[Lg];

struct cmp
{
    bool operator()(const pct &a, const pct &b )const
    {
        return a.St<b.St;
    }
};

int ap[Lg],rez[Lg],sir[Lg];
int S,n,m,k;

void citire()
{
    scanf ("%d %d %d",&n,&k,&m);
    for (int i=1;i<=n;i++)
        scanf ("%d ",&sir[i]);

    for (int i=0;i<m;i++)
    {
        scanf ("%d %d",&Q[i].St,&Q[i].Dr);
        Q[i].ind=i;
    }

    sort(Q,Q+m,cmp());
}

void solve()
{
    S=0;
    for (int i=Q[0].St;i<=Q[0].Dr;i++)
    {
        ap[sir[i]]++;
        if (ap[sir[i]]==1)
            S+=sir[i];
    }
    rez[Q[0].ind]=S;
    for (int i=1;i<m;i++)
    {
        for (int j=Q[i-1].St;j<Q[i].St;j++)
        {
            ap[sir[j]]--;
            if (ap[sir[j]]==0)
                S-=sir[i];
        }
        if (Q[i].Dr>Q[i-1].Dr)
            for (int j=Q[i-1].Dr+1;j<=Q[i].Dr;j++)
            {
                ap[sir[j]]++;
                if (ap[sir[j]]==1)
                    S+=sir[j];
            }
        else
        {
            for (int j=Q[i-1].Dr;j>Q[i].Dr;j--)
            {
                ap[sir[j]]--;
                if (ap[sir[j]]==0)
                    S-=sir[i];
            }
        }
        rez[Q[i].ind]=S;
    }
    for (int i=0;i<m;i++)
        printf("%d\n",rez[i]);
}

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT ,"w", stdout);
    citire();
    solve();
    return 0;
}