Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8359143
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 9, 20262026-06-09T11:03:08+00:00 2026-06-09T11:03:08+00:00

I have searched on internet about implementation of Segment trees but found nothing when

  • 0

I have searched on internet about implementation of Segment trees but found nothing when it came to lazy propagation. There were some previous questions on stack overflow but they were focused on solving some particular problems of SPOJ. Though I think this is the best explanation of segment trees with pseudocode but I need to implement it with lazy propagation. I found following links :

http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Segment_Trees

In addition to the above link, some blogs were also there but they all were giving reference to the same thread.

Example

An example of the application of this data structure would be something like, say I have been given a range of numbers from 1 to n. Now I perform some operations like adding some constant number to a particular range or subtracting some constant number from a particular range. After performing operations I’m supposed to tell the minimum and maximum number in the given number.

An obvious solution would be to perform addition or subtraction to each number in the given range one by one. But this can’t be feasible in a situation in which no of operations performed are large.

A better approach would be using Segment Trees with lazy propagation technique. It says instead of performing the update operation on each number individually, just keep track of all the operations until all operations are done. Then finally perform update operation to get the minimum and maximum number in the range.

Example with real data

Suppose I have given the range [1,10] which means numbers are 1,2,3,4,5,6,7,8,9,10.
Now suppose I perform an operation which decreases the numbers in the range [3,6] by 4 ,so now numbers will look like 1,2,-1,0,1,2,7,8,9,10.
Now I perform another operation which increases the numbers in the range [5,9] by 1, so the number will now look like 1,2,-1,0,2,3,8,9,10,10.

Now if I ask you to tell me the maximum and minimum number then the answer will be :

Maximum = 10

Minimum = -1

This is just a simple example.The actual problem might contain thousands of such addition/subtraction operations.I hope it’s clear now.

This is what I have understood so far but I guess there is no unified link on Internet which explains the concept and implementation in a better way.

Can anyone give some good explanation including pseudocode for lazy propagation in segment trees?

Thanks.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-09T11:03:10+00:00Added an answer on June 9, 2026 at 11:03 am

    Lazy propagation almost always includes some kind of sentry-mechanism. You have to verify that the current node doesn’t need to be propagated, and this check should be easy and fast. So there are two possibilities:

    1. Sacrifice a little bit of memory to save a field in your node, which can be checked very easily
    2. Sacrifice a little bit of runtime in order to check whether the node has been propagated and whether its child nodes have to be created.

    I sticked myself to the first. It’s very simple to check whether a node in a segmented tree should have child nodes (node->lower_value != node->upper_value), but you would also have to check whether those child node are already built (node->left_child, node->right_child), so I introduced a propagation flag node->propagated:

    typedef struct lazy_segment_node{
      int lower_value;
      int upper_value;
    
      struct lazy_segment_node * left_child;
      struct lazy_segment_node * right_child;
    
      unsigned char propagated;
    } lazy_segment_node;
    

    Initialization

    To initialize a node we call initialize with a pointer to the node pointer (or NULL) and the desired upper_value/lower_value:

    lazy_segment_node * initialize(
        lazy_segment_node ** mem, 
        int lower_value, 
        int upper_value
    ){
      lazy_segment_node * tmp = NULL;
      if(mem != NULL)
        tmp = *mem;
      if(tmp == NULL)
        tmp = malloc(sizeof(lazy_segment_node));
      if(tmp == NULL)
        return NULL;
      tmp->lower_value = lower_value;
      tmp->upper_value = upper_value;
      tmp->propagated = 0;
      tmp->left_child = NULL;
      tmp->right_child = NULL;
      
      if(mem != NULL)
        *mem = tmp;
      return tmp;
    }
    

    Access

    So far nothing special has been done. This looks like every other generic node creation method. However, in order to create the actual child nodes and set the propagation flags we can use a function which will return a pointer on the same node, but propagates it if needed:

    lazy_segment_node * accessErr(lazy_segment_node* node, int * error){
      if(node == NULL){
        if(error != NULL)
          *error = 1;
        return NULL;
      }
      /* if the node has been propagated already return it */
      if(node->propagated)
        return node;
    
      /* the node doesn't need child nodes, set flag and return */      
      if(node->upper_value == node->lower_value){
        node->propagated = 1;
        return node;
      }
    
      /* skipping left and right child creation, see code below*/
      return node;
    }
    

    As you can see, a propagated node will exit the function almost immediately. A not propagated node will instead first check whether it should actually contain child nodes and then create them if needed.

    This is actually the lazy-evaluation. You don’t create the child nodes until needed. Note that accessErr also provides an additional error interface. If you don’t need it use access instead:

    lazy_segment_node * access(lazy_segment_node* node){
      return accessErr(node,NULL);
    }
    

    Free

    In order to free those elements you can use a generic node deallocation algorithm:

    void free_lazy_segment_tree(lazy_segment_node * root){
      if(root == NULL)
        return;
      free_lazy_segment_tree(root->left_child);
      free_lazy_segment_tree(root->right_child);
      free(root);
    }
    

    Complete example

    The following example will use the functions described above to create a lazy-evaluated segment tree based on the interval [1,10]. You can see that after the first initialization test has no child nodes. By using access you actually generate those child nodes and can get their values (if those child nodes exists by the segmented tree’s logic):

    Code

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct lazy_segment_node{
      int lower_value;
      int upper_value;
      
      unsigned char propagated;
      
      struct lazy_segment_node * left_child;
      struct lazy_segment_node * right_child;
    } lazy_segment_node;
    
    lazy_segment_node * initialize(lazy_segment_node ** mem, int lower_value, int upper_value){
      lazy_segment_node * tmp = NULL;
      if(mem != NULL)
        tmp = *mem;
      if(tmp == NULL)
        tmp = malloc(sizeof(lazy_segment_node));
      if(tmp == NULL)
        return NULL;
      tmp->lower_value = lower_value;
      tmp->upper_value = upper_value;
      tmp->propagated = 0;
      tmp->left_child = NULL;
      tmp->right_child = NULL;
      
      if(mem != NULL)
        *mem = tmp;
      return tmp;
    }
    
    lazy_segment_node * accessErr(lazy_segment_node* node, int * error){
      if(node == NULL){
        if(error != NULL)
          *error = 1;
        return NULL;
      }
      if(node->propagated)
        return node;
      
      if(node->upper_value == node->lower_value){
        node->propagated = 1;
        return node;
      }
      node->left_child = initialize(NULL,node->lower_value,(node->lower_value + node->upper_value)/2);
      if(node->left_child == NULL){
        if(error != NULL)
          *error = 2;
        return NULL;
      }
      
      node->right_child = initialize(NULL,(node->lower_value + node->upper_value)/2 + 1,node->upper_value);
      if(node->right_child == NULL){
        free(node->left_child);
        if(error != NULL)
          *error = 3;
        return NULL;
      }  
      node->propagated = 1;
      return node;
    }
    
    lazy_segment_node * access(lazy_segment_node* node){
      return accessErr(node,NULL);
    }
    
    void free_lazy_segment_tree(lazy_segment_node * root){
      if(root == NULL)
        return;
      free_lazy_segment_tree(root->left_child);
      free_lazy_segment_tree(root->right_child);
      free(root);
    }
    
    int main(){
      lazy_segment_node * test = NULL;
      initialize(&test,1,10);
      printf("Lazy evaluation test\n");
      printf("test->lower_value: %i\n",test->lower_value);
      printf("test->upper_value: %i\n",test->upper_value);
      
      printf("\nNode not propagated\n");
      printf("test->left_child: %p\n",test->left_child);
      printf("test->right_child: %p\n",test->right_child);
      
      printf("\nNode propagated with access:\n");
      printf("access(test)->left_child: %p\n",access(test)->left_child);
      printf("access(test)->right_child: %p\n",access(test)->right_child);
      
      printf("\nNode propagated with access, but subchilds are not:\n");
      printf("access(test)->left_child->left_child: %p\n",access(test)->left_child->left_child);
      printf("access(test)->left_child->right_child: %p\n",access(test)->left_child->right_child);
      
      printf("\nCan use access on subchilds:\n");
      printf("access(test->left_child)->left_child: %p\n",access(test->left_child)->left_child);
      printf("access(test->left_child)->right_child: %p\n",access(test->left_child)->right_child);
      
      printf("\nIt's possible to chain:\n");
      printf("access(access(access(test)->right_child)->right_child)->lower_value: %i\n",access(access(access(test)->right_child)->right_child)->lower_value);
      printf("access(access(access(test)->right_child)->right_child)->upper_value: %i\n",access(access(access(test)->right_child)->right_child)->upper_value);
      
      free_lazy_segment_tree(test);
      
      return 0;
    }
    

    Result (ideone)

    Lazy evaluation test
    test->lower_value: 1
    test->upper_value: 10
    
    Node not propagated
    test->left_child: (nil)
    test->right_child: (nil)
    
    Node propagated with access:
    access(test)->left_child: 0x948e020
    access(test)->right_child: 0x948e038
    
    Node propagated with access, but subchilds are not:
    access(test)->left_child->left_child: (nil)
    access(test)->left_child->right_child: (nil)
    
    Can use access on subchilds:
    access(test->left_child)->left_child: 0x948e050
    access(test->left_child)->right_child: 0x948e068
    
    It's possible to chain:
    access(access(access(test)->right_child)->right_child)->lower_value: 9
    access(access(access(test)->right_child)->right_child)->upper_value: 10
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have searched the Internet and found out some information about video-conference streaming, and
I don't understand. I have searched all internet forums but found nothing helpful. I
I have searched through internet & found that there are no any direct method
I have searched far and wide on the Internet but have not found anything
I've searched the Internet and have found some good solutions for teeing STDOUT to
I have searched internet and stackoverflow thoroughly, but I haven't found answer to my
I have searched the Internet and stackoverflow.com, but got nothing. Who can give me
I have searched all over the internet and SO, and I have found some
I have searched the internet and the perforce help pages, but couldn't find a
I have searched the internet for an answer to what could be causing EXCEPTION_ACCESS_VIOLATION

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.