Cod sursa(job #2180970)

Utilizator Garen456Paun Tudor Garen456 Data 21 martie 2018 12:35:02
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
int n,m,k,last[100005];
long long a[100005],ans[100005];
long long arb[500005];
struct qr
{
   int x,y,ord;
};
qr b[100005];

bool cmp( qr h, qr j)
{
        return h.y<j.y;
}


void update(int nod,int l,int r,int pz,int val)
{
    if(l==pz && pz==r)
    { arb[nod]=1LL*val;
    return;
    }
    int mid=(l+r)/2;

    if(pz>mid)
        update(2*nod+1,mid+1,r,pz,val);
    else update(2*nod,l,mid,pz,val);
   arb[nod]=arb[nod*2]+arb[2*nod+1];
}

long long query(int nod,int l,int r,int st,int dr)
{
    if(l==st && r==dr)
        return arb[nod];

    int mid=(l+r)/2;

    if(st>mid)
        return query(2*nod+1,mid+1,r,st,dr);
    else if(dr<=mid)
         return query(2*nod,l,mid,st,dr);
    else
    {
     return query( 2*nod,l,mid,st,mid)+query(2*nod+1,mid+1,r,mid+1,dr);
    }
}

int main()
{
    fin>>n>>k>>m;
    int i,j;
    for(i=1;i<=n;++i) fin>>a[i];
    for(i=1;i<=m;++i)
    { fin>>b[i].x>>b[i].y;
       b[i].ord=i;
    }
    sort(b+1,b+m+1,cmp);
    j=1;
    for(i=1;i<=n;++i)
    {
        if(last[a[i]]) update(1,1,n,last[a[i]],0);
        update(1,1,n,i,a[i]);

        while( j<=m && b[j].y==i)
        {
            ans[  b[j].ord ]=query(1,1,n,b[j].x,b[j].y);
            ++j;
        }

        last[a[i]]=i;
    }
    for(i=1;i<=m;++i)
        fout<<ans[i]<<"\n";
    return 0;
}