Cod sursa(job #2839081)

Utilizator DooMeDCristian Alexutan DooMeD Data 25 ianuarie 2022 11:33:09
Problema Distincte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
#define aici cout << "ok"
using namespace std;
const int nmax = 1e6;

int v[nmax+5];

set<int> t[4*nmax+5];

void build(int node, int left, int right) {
    if(left==right) {
        t[node].insert(v[left]);
        return ;
    }
    int mid = (left + right) / 2;
    build(node*2,left,mid);
    build(node*2+1,mid+1,right);
    for(auto i : t[node*2])
        t[node].insert(i);
    for(auto i : t[node*2+1])
        t[node].insert(i);
}

set<int> rez;
void query(int node, int left, int right, int st, int dr) {
    if(st<=left and right<=dr) {
        for(auto i : t[node]) rez.insert(i);
        return;
    }
    int mid = (left + right) / 2;
    if(st<=mid)
        query(node*2,left,mid,st,dr);
    if(mid<dr)
        query(node*2+1,mid+1,right,st,dr);
}

int main () {
    ifstream f ("distincte.in");
    ofstream g ("distincte.out");

    int n,k,m; f >> n >> k >> m;
    for(int i=1; i<=n; i++)
        f >> v[i];

    build(1,1,n);
    for(int i=1; i<=m; i++) {
        int st,dr; f >> st >> dr;
        rez.clear();
        query(1,1,n,st,dr);
        int sum = 0;
        for(auto i : rez) sum += i;
        g << sum << "\n";
    }
    return 0;
}