Cod sursa(job #3257872)

Utilizator KRISTY06Mateiu Ianis Cristian Vasile KRISTY06 Data 19 noiembrie 2024 18:55:19
Problema Distincte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
using namespace std;

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

set<int> tree[400001];

int sum[400001];
int a[100001];

void buildTree(int left, int right, int currentNode) {
    if (left == right) {
        tree[currentNode].insert(a[left]);
        sum[currentNode] = a[left];
        return;
    }
    buildTree(left, (left + right) / 2, currentNode * 2);
    buildTree((left + right) / 2 + 1, right, currentNode * 2 + 1);
    for (set<int>::iterator it = tree[currentNode * 2].begin(); it != tree[currentNode * 2].end(); ++it) {
        if (tree[currentNode].count(*it) == 0) {
            sum[currentNode] += *it;
        }
        tree[currentNode].insert(*it);
    }
    for (set<int>::iterator it = tree[currentNode * 2 + 1].begin(); it != tree[currentNode * 2 + 1].end(); ++it) {
        if (tree[currentNode].count(*it) == 0) {
            sum[currentNode] += *it;
        }
        tree[currentNode].insert(*it);
    }
}

int query(int left, int right, int currentNode, int startPos, int endPos) {
    if (right < startPos || left > endPos) {
      //  cout << left << ' ' << right << ": " << sum[currentNode] << '\n';
        return 0;
    } else if (startPos <= left && right <= endPos) {
       // cout << left << ' ' << right << ": " << sum[currentNode] << '\n';
        return sum[currentNode];
    }
    return query(left, (left + right) / 2, currentNode * 2, startPos, endPos) + query((left + right) / 2 + 1, right, currentNode * 2 + 1, startPos, endPos);
}

int main() {
    int n, k, m;
    fin >> n >> k >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> a[i];
    }
    buildTree(1, n, 1);
    for (int i = 1; i <= m; ++i) {
        int startPos, endPos;
        fin >> startPos >> endPos;
        fout << query(1, n, 1, startPos, endPos) << '\n';
    }
    return 0;
}

/*


*/