SegmentTree (ReplacementalUpdate)

#include <cstdio>
#include <cstring>

#define INF 2147483647
#define min(a,b) (a)<(b)?(a):(b)

class SegmentTree
{
    int *segTree, *mod, N, *arr;

    void prepareTree(int parent,int b,int e)
    {
        int mid=(b+e)>>1, left=(parent<<1)+1, right=left+1;

        if(b==e) segTree[parent]=arr[b];
        else prepareTree(left,b,mid), prepareTree(right,mid+1,e), segTree[parent]=segTree[left]+segTree[right];
    }

    int sumQuery(int parent, int b,int e, int &l,int &r)
    {
        int mid=(b+e)>>1, left=(parent<<1)+1, right=left+1;

        if(mod[parent]!=INF)
        {
            if(b!=e) mod[left]=mod[right]=mod[parent];
            segTree[parent]=mod[parent]*(e-b+1), mod[parent]=INF;
        }

        if(b>r || e<l) return 0;
        if(b>=l && e<=r) return segTree[parent];

        return sumQuery(left, b,mid, l,r)+sumQuery(right, mid+1,e, l,r);
    }

    void update(int parent, int b,int e, int &l,int &r, int x)
    {
        int mid=(b+e)>>1, left=(parent<<1)+1, right=left+1;
        
        if(mod[parent]!=INF)
        {
            if(b!=e) mod[left]=mod[right]=mod[parent];
            segTree[parent]=mod[parent]*(e-b+1), mod[parent]=INF;
        }

        if(b>r || e<l) return;
        if(b>=l && e<=r)
        {
            if(b!=e) mod[left]=mod[right]=x;
            segTree[parent]=x*(e-b+1);
            return;
        }

        update(left, b,mid, l,r, x), update(right, mid+1,e, l,r, x);
        segTree[parent]=segTree[left]+segTree[right];
    }

    void getArray(int parent,int b, int e)
    {
        int mid=(b+e)>>1, left=(parent<<1)+1, right=left+1;
        
        if(mod[parent]!=INF)
        {
            if(b!=e) mod[left]=mod[right]=mod[parent];
            segTree[parent]=mod[parent]*(e-b+1), mod[parent]=INF;
        }

        if(b==e) arr[b]=segTree[parent];
        else getArray(left,b,mid), getArray(right,mid+1,e);
    }

public:
    SegmentTree(int arr_[],int N_)
    {
        N=N_;
        segTree=new int[3*N+3];
        mod=new int[3*N+3];
        for(int i=0;i<=3*N;i++) mod[i]=INF;

        arr=arr_;
        prepareTree(0,0,N-1);
        arr=NULL;
    }

    int getSum(int l,int r)
    {
        return sumQuery(0, 0,N-1, l,r);
    }

    void update(int l,int r, int x) //change the indices between l and r (inclusive) to x
    {
        update(0, 0,N-1, l,r, x);
    }

    void getArray(int *arr_)
    {
        arr=arr_;
        getArray(0,0,N-1);
        arr=NULL;
    }
};

int main()
{
    /* code */
    return 0;
}