#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; }
SegmentTree (ReplacementalUpdate)
Subscribe to:
Posts (Atom)