Cod sursa(job #2139628)

Utilizator MoleRatFuia Mihai MoleRat Data 22 februarie 2018 17:52:17
Problema Distincte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
typedef struct Q
{
    int st;
    int dr;
    int poz;
} QQ;
int n,mst,mdr,m,k;
int A[100010];
QQ B[100010];
int F[100010];
int R[100010];
int BL_size;
bool cmp(QQ a,QQ b)
{
    if (a.st/BL_size < b.st/BL_size)
        return 1;
    else if (a.st/BL_size == b.st/BL_size && a.dr<b.dr)
        return 1;
    return 0;

}
long long rez;
void add(int x)
{

    if (F[x]==0)
    {
        rez+=x;
        rez%=666013;
    }
    F[x]++;
}
void rem(int x)
{
    if (F[x]==1)
    {
        rez-=x;
        rez%=666013;
    }
    F[x]--;
}
int main()
{
    fin>>n>>k>>m;
    BL_size=sqrt(n);
    for (int i=1; i<=n; i++)
        fin>>A[i];
    for (int i=1; i<=m; i++)
    {
        fin>>B[i].st>>B[i].dr;
        B[i].poz=i;
    }
    sort(B+1,B+m+1,cmp);
    mst=1;
    mdr=0;
    for (int i=1; i<=m; i++)
    {
        while (mdr<B[i].dr)
        {
            mdr++;
            add(A[mdr]);
        }
        while (mdr>B[i].dr)
        {
            rem(A[mdr]);
            mdr--;
        }

        while (mst>B[i].st)
        {
            mst--;
            add(A[mst]);
        }
        while (mst<B[i].st)
        {
            rem(A[mst]);
            mst++;
        }
    R[B[i].poz]=rez;
    }
    for (int i=1;i<=m;i++)
        fout<<R[i]<<"\n";
    return 0;
}