Cod sursa(job #2140246)

Utilizator FredyLup Lucia Fredy Data 23 februarie 2018 09:40:11
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

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

#define lim 100010
int n,k,m,bucket;
int fr[lim],ini[lim];
struct intrebare {int st,dr,ind;}   q[lim];
int nrb, moL, moR, L, R, answer;
int sol[lim];

bool cmp (intrebare A, intrebare B)
{
    if (A.st/bucket != B.st/bucket)   return (A.st/bucket) < (B.st/bucket);
    return A.dr < B.dr;
}

void adauga (int val)
{
    fr[val]++;
    if (fr[val]==1) answer+=val;
}

void sterge (int val)
{
    fr[val]--;
    if (fr[val]==0) answer-=val;
}

int main()
{
    fin>>n>>k>>m;
    for (int i=1; i<=n; i++)    fin>>ini[i];
    bucket = (int)sqrt(n);
    for (int i=1; i<=m; i++)
    {
        fin>>q[i].st>>q[i].dr;
        q[i].ind=i;
    }

    sort (q+1, q+m+1, cmp);

    moL=0, moR=0, answer=0;
    for (int i=1; i<=m; i++)
    {
         L=q[i].st, R=q[i].dr;

         while (moR<R)
         {
             moR++;
             adauga (ini[moR]);
         }
         while (moR>R)
         {
             sterge (ini[moR]);
             moR--;
         }
         while (moL<L)
         {
             sterge (ini[moL]);
             moL++;
         }
         while (moL>L)
         {
             moL--;
             adauga (ini[moL]);
         }

         sol[q[i].ind] = answer;
    }

    for (int i=1; i<=m; i++)    fout<<sol[i]<<'\n';

    fout.close();
    return 0;
}