Untitled
unknown
plain_text
a year ago
1.5 kB
7
Indexable
#define int long long ll n1; ll mod =1e9+7; ll mrg (ll x ,ll y ) { x=max(x,1ll); y=max(y,1ll); return (x*y)%mod; } struct segment_tree { vector<ll> tree; void clear() { tree.clear(); } void init(int num, const vector<ll>& a) { n1 = num; tree.assign(4 * n1, 1ll); build(a); } void build(const vector<ll>& a, int id=0,int ns = 0, int ne = n1-1) { if(ns==ne){ tree[id] =max(a[ns]%mod,1ll); return ; } int l = 2*id+1; int r = l+1; int md = ns+(ne-ns)/2; build(a,l, ns, md); build(a,r, md+1, ne); tree[id] = mrg(tree[l],tree[r]); } ll query(int qs, int qe, int id=0, int ns=0, int ne=n1-1) { if(ns>qe || qs>ne){ return 1; ///infnity } if(qs<=ns && qe>=ne){ return tree[id]; } int l = 2*id+1; int r = l+1; int md = ns+(ne-ns)/2; ll ndl = query(qs, qe, l, ns, md); ll ndr = query(qs, qe,r, md+1,ne); return mrg(ndl,ndr ); } void upd(int pos , int val , int id=0, int ns=0,int ne=n1-1) { if(ns>pos || pos>ne){ return; } if(ns==ne){ tree[id]=val; return ; } int l = 2*id+1; int r = l+1; int md = ns+(ne-ns)/2; upd(pos, val,l, ns, md); upd(pos, val, r, md+1, ne); tree[id] = mrg(tree[l],tree[r]); } } st ;
Editor is loading...
Leave a Comment