Cod sursa(job #2520107)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 8 ianuarie 2020 22:41:35
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int NMax = 1e5, MOD = 666013;

int N, M, K, AIB[4 * NMax + 5], Prev[NMax + 5], Last[NMax + 5], V[NMax + 5], Sol[NMax + 5];
vector < pair<int, int> > Q[NMax + 5];

void Update(int pos, int val)
{
    for(int i = pos; i <= N; i += (i & (-i)))
        AIB[i] = (AIB[i] + val + MOD) % MOD;
}

int Sum(int pos)
{
    int Sol = 0;

    for(int i = pos; i > 0; i -= (i & (-i)))
        Sol = (Sol + AIB[i]) % MOD;

    return Sol;
}

int main()
{
    fin >> N >> K >> M;

    for(int i = 1; i <= N; i++)
    {
        fin >> V[i];
        Prev[i] = Last[V[i]];
        Last[V[i]] = i;
    }

    for(int i = 1, x, y; i <= M; i++)
    {
        fin >> x >> y;
        Q[y].push_back({x, i});
    }

    for(int i = 1; i <= N; i++)
    {
        Update(i, V[i]);

        if(Prev[i])
            Update(Prev[i], -V[i]);

        for(auto st : Q[i])
            Sol[st.second] = (Sum(i) - Sum(st.first - 1) + MOD) % MOD;
    }
    for(int i = 1; i <= M; i++)
        fout << Sol[i] << '\n';

    fin.close();
    fout.close();

    return 0;
}