Cod sursa(job #1045361)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 1 decembrie 2013 14:39:20
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

struct query{int x, y, nr;};

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

const int Nmax = 100010;
const int MOD = 666013;

int N, K, M, a[Nmax], aib[Nmax], indq[Nmax], uz[Nmax];
query q[Nmax];

bool cmp(const query a, const query b)
{
    return a.y < b.y;
}

void Update(int poz, int val)
{
    for(; poz <= N; poz += (poz & -poz))
        aib[poz] = (aib[poz] + val + 0LL) % MOD;
}

int Sum(int poz)
{
    int rez = 0;
    for(; poz; poz -= (poz & -poz))
        rez = (rez + aib[poz] + 0LL) % MOD;
    return rez;
}

int main()
{
    fin>>N>>K>>M;
    for(int i=1; i<=N; i++)
        fin>>a[i];
    for(int i=1; i<=M; i++)
    {
        fin>>q[i].x>>q[i].y;
        q[i].nr = i;
    }


    sort(q+1, q+M+1, cmp);
    for(int i = 1; i <= M; i++)
    {
        for(int j = q[i-1].y + 1; j <= q[i].y; j++)
        {
            if(uz[a[j]]) Update(uz[a[j]], -a[j]);
            uz[a[j]] = j; Update(j, a[j]);
        }
        indq[q[i].nr] = (Sum(q[i].y) - Sum(q[i].x - 1)) % MOD;
    }

    for(int i=1; i<=M; i++)
        fout<<indq[i]<<'\n';
    return 0;
}