Cod sursa(job #998595)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 17 septembrie 2013 18:36:28
Problema Distincte Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <algorithm>

using namespace std;

#define llint long long int

llint aib[100005],n,frec[100005],ante[100005],v[100005],real[100005],fin[100005];
#define lsb(x) (x&(-x))

void update(llint x,llint val)
{
    if(x==0)
        return;
    real[x]=val;
    for(;x<=n;x+=lsb(x))
        aib[x]+=val;
}

llint query(llint x)
{
    llint sum=0;
    for(;x>=1;x-=lsb(x))
        sum+=aib[x];
    return sum;
}

struct segm
{
    llint st,dr;
    llint init;
}llintreb[100005];

bool operator<(const segm &a,const segm &b)
{
    if(a.dr<b.dr)
        return 1;
    else if(a.dr==b.dr)
        if(a.st<b.st)
            return 1;
    return 0;
}

int main()
{
    ifstream cin("distincte.in");
    ofstream cout("distincte.out");

    llint m=0,k,i,poz=0;
    cin>>n>>k>>m;
    for(i=1;i<=n;i++)
    {
        cin>>v[i];
        ante[i]=frec[v[i]];
        frec[v[i]]=i;
    }

    for(i=0;i<m;i++)
    {
        cin>>llintreb[i].st>>llintreb[i].dr;
        llintreb[i].init=i;
    }
    sort(llintreb,llintreb+m);
    for(i=1;i<=n;i++)
    {
        update(ante[i],-real[ante[i]]);
        update(i,v[i]);
        while(llintreb[poz].dr==i)
        {
            fin[llintreb[poz].init]=query(i)-query(llintreb[i].st-1);
            poz++;
        }
    }
    for(i=0;i<m;i++)
        cout<<fin[i]<<'\n';
    cin.close();
    cout.close();
    return 0;
}