Cod sursa(job #2092739)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 22 decembrie 2017 11:10:57
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("distincte.in");
ofstream fout ("distincte.out");

const int nmax=100003;

struct tt{
    int a,b,c;
}v[nmax];

int n,kk,mm,aib[nmax],m[nmax],f[nmax],k=1,sol[nmax];

int lsb(int q){
    return q & -q;
}

void update(int q, int qq){
    while(q<=n){
        aib[q]+=qq;
        q+=lsb(q);
    }
}

int query(int q){
    int sum=0;
    while(q){
        sum+=aib[q];
        q-=lsb(q);
    }
    return sum;
}

bool sortf(tt q, tt qq){
    return q.b<qq.b || (q.b == qq.b && q.a<qq.a);
}

int main()
{
    int a,b;
    fin>>n>>kk>>mm;
    for(int i=1;i<=n;++i){
        fin>>m[i];
    }
    for(int i=1;i<=mm;++i){
        fin>>v[i].a>>v[i].b;
        v[i].c=i;
    }
    sort(v+1,v+mm+1,sortf);
    for(int i=1;i<=n;++i){
        if(f[m[i]])update(f[m[i]],-m[i]);
        update(i,m[i]);
        f[m[i]]=i;
        while(v[k].b==i && k<=mm){
            sol[v[k].c]=query(v[k].b)-query(v[k].a-1);
            k++;
        }
    }
    for(int i=1;i<=mm;++i)fout<<sol[i]<<'\n';
    return 0;
}