let's start Code

Segment Tree

                                                    Resource Link:

 টিউটোরিয়াল গুলো ক্রম অনুযায়ী সাজানো নাই।

ডাটা স্ট্রাকচার: সেগমেন্ট ট্রি-১

ডাটা স্ট্রাকচার: সেগমেন্ট ট্রি-২ (লেজি প্রপাগেশন)

Kaidul blog 

blog 

Segment tree/ BIT part - 1

লোয়েস্ট কমন অ্যানসেস্টর

Persistent Segment Tree (Part - 01)

Persistent Segment Tree (Part - 02)

A simple approach to segment trees

A simple approach to segment trees, part 2

TopCoder Tutorial

Indian Computing Olympiad

visualgo

E-Maxx : Segment Tree

Algorithm Gym :: Everything About Segment Trees

Efficient and easy segment trees

Segment trees (for beginners)

csacademy

Segment Trees and lazy propagation

Segment Trees

Persistent segment trees – Explained with spoj problems

Persistence Made Simple - Tutorial

CF blog problem list 

Problem Link

CF blog problem list 


#include<bits/stdc++.h>
using namespace std;
#define mx 100001
int ar[mx];
int tree[mx*3];
void init(int node, int b, int e)
{
if(b == e)
{
tree[node] = ar[b];
return;
}
int Left = node*2;
int Right = node*2 + 1;
int mid = (b + e)/2;
init(Left, b, mid);
init(Right, mid+1, e);
tree[node] = tree[Left] + tree[Right];
}
int query(int node, int b, int e, int i, int j)
{
if(i > e || j <b)return tree[node];
if(b >= i && e <= j)
{
return tree[node];
}
int Left = node*2;
int Right = node*2 + 1;
int mid = (b+e)/2;
int p1 = query(Left, b, mid, i, j);
int p2 = query(Right, mid+1, e, i, j);
return p1+p2;
}
int update(int node, int b, int e, int i)
{
int ans = 0;
if(i > e || i < b)return ans;
if(b >=i && e <= i)
{
ans = tree[node];
tree[node] = 0;
return ans;
}
int Left = node*2;
int Right = node*2 + 1;
int mid = (b+e)/2;
update(Left, b, mid, i);
update(Right, mid+1, e, i);
tree[node] = tree[Left] + tree[Right];
}
void update1(int node, int b, int e, int i, int newvalue)
{
if(i > e || i < b)return;
if(b >=i && e <= i)
{
tree[node] += newvalue;
return;
}
int Left = node*2;
int Right = node*2 + 1;
int mid = (b+e)/2;
update1(Left, b, mid, i,newvalue);
update1(Right, mid+1, e, i, newvalue);
tree[node] = tree[Left] + tree[Right];
}
int main()
{
int n,q;
cin >> n >> q;
for(int i =1; i <= n; i++)
{
cin >> ar[i];
}
init(1,1,n);
for(int i = 1; i <= 9; i++)
{
cout<<tree[i]<<" ";
}
cout<<endl;
for(int i = 1; i <= q; i++)
{
int x,idx,v,a,b;
cin >>x;
if(x == 1)
{
cin >> idx;
cout << query(1,1,n,idx+1,idx+1)<<endl;
update(1,1,n,idx+1);
}
else if(x== 2)
{
cin >> v;
update1(1,1,n,idx,v+1);
}
else if(x == 3)
{
cin >> a >>b;
cout<<query(1,1,n,a+1,b+1)<<endl;
}
}
return 0;
}
view raw segmentTree.cpp hosted with ❤ by GitHub

                       Lazy Segment tree

 

Share:

Related Posts:

No comments:

Post a Comment

About

let's start CODE

Popular Posts