-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSegment_1.cpp
More file actions
137 lines (114 loc) · 2.82 KB
/
Copy pathSegment_1.cpp
File metadata and controls
137 lines (114 loc) · 2.82 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include<bits/stdc++.h>
using namespace std;
class Segment{
public:
vector<int>seg;
Segment(int n){
seg.resize(4*n);
}
void build(int i,int low,int high,int arr[]){ //Build code for segment tree
if(low == high){
seg[i] = arr[low];
return;
}
int mid = (low + high)/2;
build(2*i+1,low,mid,arr);
build(2*i+2,mid+1,high,arr);
seg[i] = min(seg[2*i +1] , seg[2*i+2]);
}
int query(int i,int low,int high,int l,int r,int arr[]){
//no overlap -> l r [low ...high] , [low ... high] l .. r
if( r < low || l > high){
return INT_MAX;
}
//complete Overlap -> [l low high r]
if(l <= low && r >= high){
return seg[i];
}
else{ //partial -> move both sides
int mid = (low +high)/2;
int left = query(2*i+1,low,mid,l,r,arr);
int right = query(2*i+2,mid+1,high,l,r,arr);
return min(left,right);
}
}
void update(int ind,int low,int high,int i,int val,int arr[]){
if( ind == i){
seg[i] = val;
}
int mid = (low + high)/2;
if(i <= mid)
update(2*i+1,low,mid,i,val,arr);
else
update(2*i+2,mid+1,high,i,val,arr);
seg[i] = min(seg[2*i +1] , seg[2*i+2]);
}
};
void solve1(){
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++)
cin >> arr[i];
Segment s1(n);
s1.build(0, 0, n - 1, arr);
int k;
cin >> k;
while (k--) {
int type;
cin>>type;
if(type == 1){
int l, r;
cin >> l >> r;
cout << s1.query(0, 0, n - 1, l, r, arr) << endl;
}
else{
int i,val;
cin>>i>>val;
s1.update(0,.0,n-1,i,val,arr);
arr[i] = val;
}
}
}
void solve2(){
int n1;
cin>>n1;
int arr1[n1];
for(int i = 0;i<n1;i++)cin>>arr1[i];
Segment s1(n1);
s1.build(0,0,n1-1,arr1);
int n2;
cin>>n2;
int arr2[n2];
for(int i = 0;i<n2;i++)cin>>arr2[i];
Segment s2(n2);
s2.build(0,0,n2-1,arr2);
int k;
cin>>k;
while(k--){
int type;
cin>>type;
if(type == 1){
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
int min1 = s1.query(0,0,n1-1,l1,r1,arr1);
int min2 = s2.query(0,0,n2-1,l2,r2,arr2);
cout<<min(min1,min2)<<endl;
}
if(type == 2){
int arrno,i,val;
cin>>arrno>>i>>val;
if(arrno == 1){
s1.update(0,0,n1-1,i,val,arr1);
arr1[i] = val;
}
else if(arrno == 2){
s2.update(0,0,n2-1,i,val,arr2);
}
}
}
}
int main(){
solve2();
return 0;
}