Cod sursa(job #2065045)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 13 noiembrie 2017 11:59:00
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
# include <fstream>
# include <algorithm>
# define DIM 100010
# define a first.first
# define b first.second
# define c second
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
pair<pair<long long ,long long >,long long > q[DIM];
long long  arb[5*DIM],v[DIM],f[DIM],sol[DIM],n,m,k,i,j,s;
void update(int nod,int st,int dr,int poz,int val){
    if(st==dr){
        arb[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(2*nod,st,mij,poz,val);
    else
        update(2*nod+1,mij+1,dr,poz,val);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void query(int nod,int st,int dr,int p,int u){
    if(p<=st&&u>=dr){
        s+=arb[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(p<=mij)
        query(2*nod,st,mij,p,u);
    if(u>mij)
        query(2*nod+1,mij+1,dr,p,u);
}
int main () {
    fin>>n>>k>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<=m;i++){
        fin>>q[i].b>>q[i].a;
        q[i].c=i;
    }
    sort(q+1,q+m+1);
    j=1;
    for(i=1;i<=n;i++){
        if(f[v[i]])
            update(1,1,n,f[v[i]],0);
        f[v[i]]=i;
        update(1,1,n,i,v[i]);
        while(q[j].a==i&&j<=m){
            s=0;
            query(1,1,n,q[j].b,q[j].a);
            sol[q[j].c]=s;
            j++;
        }
    }
    for(i=1;i<=m;i++)
        fout<<sol[i]<<"\n";
    return 0;
}