Segment Tree

Contents

  • Implementation,Update And Lazy Segment Tree.

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

int lazy[1000]={0}; 

void UpdateRangeLazy(int tree[],int S,int E,int l,int r,int inc,int index){
    if(lazy[index]!=0){
        tree[index]+=lazy[index];
        if(S!=E){
            lazy[2*index]+=lazy[index];
            lazy[2*index+1]+=lazy[index];   
        }
        lazy[index]=0;
    }

    if(S>r || l>E ){
        return ;
    }

    if(S>=l && E<=r){
        tree[index]+=inc;

        if(S!=E){
            lazy[2*index]=inc;
            lazy[2*index+1]=inc;
        }
        return ;
    }
    int mid=(S+E)/2;
    UpdateRangeLazy(tree,S,mid,l,r,inc,2*index);
    UpdateRangeLazy(tree,mid+1,E,l,r,inc,2*index+1);
    tree[index]=min(tree[2*index],tree[2*index+1]);
    return ;   
}

int QueryInLazy(int tree[],int S,int E,int l,int r,int index){
    if(lazy[index]!=0){
        tree[index]+=lazy[index];
        if(S!=E){
            lazy[2*index]=lazy[index];
            lazy[2*index+1]=lazy[index];

        }
        lazy[index]=0;
    }
    if(S>l || E<l)
        return INT_MAX;

    if(S>=l && E<=r){
        return tree[index];
    }

    int mid=(S+E)/2;
    QueryInLazy(tree,S,mid,l,r,2*index);
    QueryInLazy(tree,mid+1,E,l,r,2*index+1);
    return tree[index]=min(tree[2*index],tree[2*index+1]);


}


void buildTree(int A[],int tree[],int start,int end,int index){
    if(start==end){
        tree[index]=A[start];
        return;
    }

    int mid=start+(end-start)/2;
    buildTree(A,tree,start,mid,2*index);
    buildTree(A,tree,mid+1,end,2*index+1);
    tree[index]=min(tree[2*index],tree[2*index+1]);
    return ;

}

int query(int tree[],int S,int E,int l ,int r,int index){
    //Fully Overlap
    if(l<=S && r>=E){
        return tree[index];
    }

    if(r<S || l>E){
        return INT_MAX;
    }
    int mid=(S+E)/2;
    int left=query(tree,S,mid,l,r,2*index);
    int right=query(tree,mid+1,E,l,r,2*index+1);
    tree[index]=min(left,right);
    return tree[index];

}

void UpdateOnIndex(int tree[],int S,int E,int i,int inc,int index){
    if(i>E || i<S){
        return ;
    }
    if(S==E){
        tree[index]+=inc;
        return;
    }

    int mid=(S+E)/2;
    UpdateOnIndex(tree,S,mid,i,inc,2*index);
    UpdateOnIndex(tree,mid+1,E,i,inc,2*index+1);
    tree[index]=min(tree[2*index],tree[2*index+1]);

}

void UpdateOnRange(int tree[],int S,int E,int l,int r,int inc,int index){
    if(r<S || l>E){
        return;
    }
    if(S==E)
    {
        tree[index]+=inc;
        return;
    }

    int mid=(S+E)/2;
    UpdateOnRange(tree,S,mid,l,r,inc,2*index);
    UpdateOnRange(tree,mid+1,E,l,r,inc,2*index+1);
     tree[index]=min(tree[2*index],tree[2*index+1]);
    return;

}


int main()
{
    int A[]={1,3,2,-5,6,4};
    int n=6;
    int tree[4*n+1]={0};
    buildTree(A,tree,0,n-1,1);

    //int l,r;
    //cin>>l>>r;
    //cout<<query(tree,0,n-1,l,r,1);

    //int i,inc;
    //cin>>i>>inc;
    //UpdateOnIndex(tree,0,n-1,i,inc,1);
    //
    //int l,r;
    //cin>>l>>r;
    //cout<<query(tree,0,n-1,l,r,1);

    int l,r,inc;
    cin>>l>>r>>inc;
    UpdateRangeLazy(tree,0,n-1,l,r,inc,1);

    int q1,q2;
    cin>>q1>>q2;
    cout<<QueryInLazy(tree,0,n-1,q1,q2,1);




}
  • Counting the number of zeros, searching for the k th zero.
int find_kth(int v, int tl, int tr, int k) {
    if (k > t[v])
        return -1;
    if (tl == tr)
        return tl;
    int tm = (tl + tr) / 2;
    if (t[v*2] >= k)
        return find_kth(v*2, tl, tm, k);
    else 
        return find_kth(v*2+1, tm+1, tr, k - t[v*2]);
}
  • Searching for an array prefix with a given amount.
  • Searching for the first element greater than a given amount.
  • Finding sub segments with the maximal sum GSS1

  • Merge Sort Tree