-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSegTree_RMQ_with_update.cpp
More file actions
123 lines (122 loc) · 3.23 KB
/
SegTree_RMQ_with_update.cpp
File metadata and controls
123 lines (122 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <bits/stdc++.h>
#include <cstring>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define all(v) v.begin(),v.end()
#define mkp make_pair
#define el '\n'
#define V vector
#define vi V<int>
#define vvi V<vi>
#define vl V<ll>
#define vul V<ull>
#define vb V<bool>
#define mpii map<P<int,int>,int>
#define mii map<int,int>
#define PQ priority_queue
#define Q queue
#define MS multiset
#define pb push_back
#define vc vector<char>
#define vs vector<string>
#define P pair
#define pd pair<double,double>
#define pl pair<ll,ll>
#define pi pair<int,int>
#define tiii tuple<int,int,int>
#define vpi V<pair<int,int>>
#define vpl V<pair<ll,ll>>
#define F first
#define S second
#define OO (int)1e9
#define rep(i,n) for(int i=1;i<=n;++i)
#define rep0(i,n) for(int i=0;i<n;++i)
#define per(i,n) for(int i=n;i>-1;--i)
#define sz(v) (unsigned int)v.size()
#define fixed(n) fixed<<setprecision(n)
#define printDS(s) {for(auto ss:s)cout<<ss<<' ';}
#define Print2DGrid(arr,N,M) rep0(i,N){rep0(j,M)cout<<arr[i][j];cout<<el;}
#define clrA(v, d) memset(v, d, sizeof(v)) // range {-1,0,0x3f}
#define clrV(v, d) memset(&v[0], d, sz(v) * sizeof(v[0]))
#define Rev(v) reverse(all(v))
#define sortt(v) sort(all(v))
#define RevSortt(v) sort(all(v),greater<>())
#define ssort(v) stable_sort(all(v))
#define FastIo ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); // std:: be3:)
using namespace std;
// صلوا على النبى
const ll MAX=3e3+5, MOD= 1e9+7,INF = 1e18;
const double EPS=1e-9,PI = acos(-1);
ll t=1,N,M,K,u,v,C;
/*************************************************/
// problem :: https://cses.fi/problemset/task/1649
int n;
vi arr,tree;
void build(){
// fill leaves of the tree
for(int i = 0; i < sz(arr);++i){
tree[n+i] = arr[i];
}
// fill the intervals nodes from their left&right children
for(int i = n-1; i >= 1;--i){
tree[i] = min(tree[2*i],tree[2*i+1]); // RMQ
}
}
void update (int index,int new_value){
// time : log(N)
tree[n+index] = new_value;
// then update Affected_parents of this leafNode
for(int i = (n+index)/2; i>=1 ;i/=2){
tree[i] = min(tree[2*i],tree[2*i+1]);
}
}
int query(int nodeNumber,int start,int end,int x,int y){
if(start>=x && end<=y){ // in range ?
return tree[nodeNumber];
}
if(x>end || y<start) { // out of the interval ?
return OO;
}
// RMQ
return min(query(2*nodeNumber,start,(start+end)/2,x,y) // branch left
,query(2*nodeNumber+1,(start+end)/2+1,end,x,y)); // branch right
}
void takeQueries(int q){
while (q--){
int qt,l,r;
cin>>qt>>l>>r;
if(qt == 1){
l--;
update(l,r);
}else if(qt == 2){
l--,r--;
ll ans = query(1,0,n-1,l,r);
cout << ans<<el;
}
}
}
void mainData(){
int q;
cin>>n>>q;
arr.resize(n);
for(auto &i:arr)
cin>>i;
while (__builtin_popcount(n) != 1) // this change our tree size to the next power of 2 if it was not
n++;
tree.resize(2*n);
build();
takeQueries(q);
}
/*************************************************/
void solve() {
mainData();
}
int main() {
FastIo
//cin>>t;
while (t--)
{solve();}
//cout<<"\nFinished\n";
return 0;
}