Cod sursa(job #3262509)

Utilizator KRISTY06Mateiu Ianis Cristian Vasile KRISTY06 Data 10 decembrie 2024 12:09:31
Problema Distincte Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, k, m, a[100001], sortedQueriesLen;

pair<int, int> queries[100001];
pair<int, int> sortedQueries[100001];
pair<int, int> tree[400001];

map<pair<int, pair<int, int>>, bool> wasAdded;
map<pair<int, int>, int> ans;

void updateTree(int left, int right, int currentNode, int pos, pair<int, int> query) {
    if (pos < left || pos > right) {
        return;
    } else if (left == right) {
        tree[currentNode] = query;
        return;
    }
    updateTree(left, (left + right) / 2, currentNode * 2, pos, query);
    updateTree((left + right) / 2 + 1, right, currentNode * 2 + 1, pos, query);
    if (tree[currentNode * 2].second > tree[currentNode * 2 + 1].second) {
        tree[currentNode] = tree[currentNode * 2];
    } else if (tree[currentNode * 2].second <= tree[currentNode * 2 + 1].second) {
        tree[currentNode] = max(tree[currentNode * 2], tree[currentNode * 2 + 1]);
    }
}

void addNewValues(int left, int right, int currentNode, int pos) {
    if (tree[currentNode].second < pos) {
        return;
    } else if (left == right) {
        if (wasAdded[{a[pos], tree[currentNode]}] == 0) {
            ans[tree[currentNode]] += a[pos];
            wasAdded[{a[pos], tree[currentNode]}] = 1;
        }
        return;
    }
    addNewValues(left, (left + right) / 2, currentNode * 2, pos);
    addNewValues((left + right) / 2 + 1, right, currentNode * 2 + 1, pos);
}

int main() {
    fin >> n >> k >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> a[i];
    }
    for (int i = 1; i <= m; ++i) {
        fin >> queries[i].first >> queries[i].second;
        sortedQueries[++sortedQueriesLen] = queries[i];
    }
    sort(sortedQueries + 1, sortedQueries + sortedQueriesLen + 1);
    for (int i = 1, j = 1; i <= n; ++i) {
        while (j <= m && i == sortedQueries[j].first) {
            updateTree(1, n, 1, i, sortedQueries[j]);
            ++j;
        }
        addNewValues(1, n, 1, i);
    }
    for (int i = 1; i <= m; ++i) {
        fout << ans[queries[i]] << '\n';
    }
    return 0;
}