Cod sursa(job #2021484)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 13 septembrie 2017 19:26:09
Problema Distincte Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <bits/stdc++.h>

using namespace std;

class Node{
    public:
        Node(){
            left = NULL;
            right = NULL;
            val = 0;
        }
        Node* getCopy(){
            Node* ret = new Node();

            ret->left = this->left;
            ret->right = this->right;
            ret->val = this->val;

            return ret;
        }
        Node* left;
        Node* right;
        int val;
    private:
};

Node* roots[30005];

class PersistentSegmentTree{
    public:
        PersistentSegmentTree(int _n){
            n = _n;
        }
        Node* build(int lf, int rg){
            Node* ans = new Node();
            if(lf < rg){
                int md = (lf + rg) >> 1;
                ans->left = build(lf, md);
                ans->right = build(md + 1, rg);
            }
            return ans;
        }
        Node* update(Node* cr, int lf, int rg, int pos, int x){
            cr = cr->getCopy();
            if(lf > rg){
                return cr;
            }
            if(lf == rg){
                cr->val += x;
                return cr;
            }
            int md = (lf + rg) >> 1;
            if(pos <= md){
                cr->left = update(cr->left, lf, md, pos, x);
            }else{
                cr->right = update(cr->right, md + 1, rg, pos, x);
            }
            cr->val = cr->left->val + cr->right->val;
            return cr;
        }
        int query(Node* cr, int lf, int rg, int x, int y){
            if(x > rg || y < lf){
                return 0;
            }
            if(x <= lf && rg <= y){
                return cr->val;
            }
            int md = (lf + rg) >> 1;
            return query(cr->left, lf, md, x, y) + query(cr->right, md + 1, rg, x, y);
        }
    private:
        int n;
};

int v[30005];
int last[1000005];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ifstream fin("distincte.in");
    ofstream fout("distincte.out");
    int n, k, q;
    fin >> n >> k >> q;
    PersistentSegmentTree pst(n);
    roots[0] = pst.build(0, n);
    for(int i = 1;i <= n;i++){
        int x;
        fin >> x;
        roots[i] = pst.update(roots[i - 1], 0, n, i, x);
        if(last[x])
            roots[i] = pst.update(roots[i], 0, n, last[x], -x);
        last[x] = i;
    }
    for(int i = 1;i <= q;i++){
        int x, y;
        fin >> x >> y;
        fout << pst.query(roots[y], 0, n, x, y) - pst.query(roots[x - 1], 0, n, x, y) << '\n';
    }
    return 0;
}