Cod sursa(job #3131113)

Utilizator MateitzaMatei Dinu Mateitza Data 19 mai 2023 11:42:33
Problema Distincte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int MAX_SIZE = 1e5 + 17;
const int MOD = 666013;

long long segmentTree[MAX_SIZE * 6];
long long answer[MAX_SIZE];

int arr[MAX_SIZE];
int previousIndex[MAX_SIZE];

vector<pair<int, int>> queries[MAX_SIZE];

void update(int node, int left, int right, int index, int value)
{
    if (left == right)
    {
        segmentTree[node] = value;
        return;
    }

    int mid = (left + right) / 2;

    if (index <= mid)
        update(node * 2, left, mid, index, value);
    else
        update(node * 2 + 1, mid + 1, right, index, value);

    segmentTree[node] = (segmentTree[node * 2] + segmentTree[node * 2 + 1]) % MOD;
}

long long query(int node, int left, int right, int queryLeft, int queryRight)
{
    if (queryLeft <= left && right <= queryRight)
    {
        return segmentTree[node];
    }

    int mid = (left + right) / 2;

    long long sum = 0;

    if (queryLeft <= mid)
        sum += query(node * 2, left, mid, queryLeft, queryRight);

    if (queryRight > mid)
        sum += query(node * 2 + 1, mid + 1, right, queryLeft, queryRight);

    return sum % MOD;
}

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

    for (int i = 1; i <= N; i++)
        fin >> arr[i];

    for (int i = 1; i <= M; i++)
    {
        int left, right;
        fin >> left >> right;

        queries[right].push_back({ left, i });
    }

    for (int i = 1; i <= N; i++)
    {
        update(1, 1, N, i, arr[i]);

        if (previousIndex[arr[i]] != 0)
        {
            update(1, 1, N, previousIndex[arr[i]], 0);
        }

        previousIndex[arr[i]] = i;

        for (auto j : queries[i])
            answer[j.second] = query(1, 1, N, j.first, i);
    }

    for (int i = 1; i <= M; i++)
        cout << answer[i] << '\n';

    return 0;
}