Wednesday, March 22, 2023
HomeSoftware DevelopmentMerge Type Tree with level replace utilizing Coverage Based mostly Knowledge Construction

Merge Type Tree with level replace utilizing Coverage Based mostly Knowledge Construction


#embody <bits/stdc++.h>

utilizing namespace std;

  

class PST {

public:

    struct Node {

        int val;

        int lc;

        int rc;

  

        Node(int v = 0, int l = -1, int r = -1)

            : val(v), lc(l), rc(r)

        {

        }

    };

  

    vector<Node> t;

  

    PST() { t.push_back({}); }

  

    int replace(int cur, int l, int r, int idx, int diff)

    {

        int new_node = t.dimension();

  

        

        t.push_back(t[cur]);

        t[new_node].val += diff;

        if (l == r) {

            return new_node;

        }

        int mid = (l + r) >> 1;

        if (idx <= mid) {

            t[new_node].lc

                = replace(t[cur].lc, l, mid, idx, diff);

        }

        else {

            t[new_node].rc

                = replace(t[cur].rc, mid + 1, r, idx, diff);

        }

        return new_node;

    }

  

    int question(int cur, int l, int r, int ql, int qr)

    {

        if (ql <= l && r <= qr) {

            return t[cur].val;

        }

        int mid = (l + r) >> 1;

        int res = 0;

        if (ql <= mid) {

            res += question(t[cur].lc, l, mid, ql, qr);

        }

        if (mid < qr) {

            res += question(t[cur].rc, mid + 1, r, ql, qr);

        }

        return res;

    }

};

  

class MST {

public:

    vector<int> a;

    PST pst;

    vector<int> root;

    int n;

  

    MST(vector<int> v)

    {

        a = v;

        n = v.dimension();

        root.push_back(pst.replace(0, 0, n - 1, v[0], 1));

        for (int i = 1; i < n; i++) {

            root.push_back(

                pst.replace(root.again(), 0, n - 1, v[i], 1));

        }

    }

  

    int construct(int l, int r)

    {

        if (l == r) {

            return pst.replace(0, 0, n - 1, a[l], 1);

        }

        int mid = (l + r) >> 1;

        int left = construct(l, mid);

        int proper = construct(mid + 1, r);

        return merge(left, proper, l, r);

    }

  

    int merge(int left, int proper, int l, int r)

    {

        int cur = root.dimension();

        root.push_back(0);

        int mid = (l + r) >> 1;

        for (int i = l, j = mid + 1; i <= mid || j <= r;) {

            if (j > r || (i <= mid && a[i] < a[j])) {

                root[cur] = pst.replace(root[cur], 0, n - 1,

                                       a[i], 1);

                i++;

            }

            else {

                root[cur] = pst.replace(root[cur], 0, n - 1,

                                       a[j], 1);

                j++;

            }

        }

        return cur;

    }

  

    int question(int cur, int l, int r, int ql, int qr, int x)

    {

        if (ql <= l && r <= qr) {

            return pst.question(root[cur], 0, n - 1, 0, x);

        }

        int mid = (l + r) >> 1;

        int res = 0;

        if (ql <= mid) {

            res += question(cur - 1, l, mid, ql, qr, x);

        }

        if (mid < qr) {

            res += question(cur - 1, mid + 1, r, ql, qr, x);

        }

        return res;

    }

  

    void replace(int idx, int new_val)

    {

        a[idx] = new_val;

        root.push_back(construct(0, n - 1));

    }

};

  

int primary()

{

    vector<int> v = { 1, 4, 2, 3, 5 };

    MST mst(v);

  

    

    

    cout << mst.question(v.dimension() - 1, 0, v.dimension() - 1, 1, 3,

                      3)

         << endl;

  

    

    mst.replace(2, 5);

  

    

    

    cout << mst.question(v.dimension() - 1, 0, v.dimension() - 1, 1, 3,

                      3)

         << endl;

  

    return 0;

}

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments