Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*i am not gonna
- lose this time*/
- #include <bits/stdc++.h>
- using namespace std;
- #define fast ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
- #define ll long long
- #define mp make_pair
- #define pb push_back
- #define st(x) x.begin(),x.end()
- #define sz(x) (int)(x).size()
- const int N = 1 << 20 ;
- int a[N] ;
- int seg_tree[N] ;
- void build(ll first , ll last , ll node ) {
- if(first == last ) {
- seg_tree[node] = a[first] ;
- return ;
- }
- ll mid = (first + last ) / 2 ;
- build(first , mid , 2 * node) ;
- build(mid + 1 , last , 2 * node + 1) ;
- seg_tree[node] = min (seg_tree[2 * node] , seg_tree[2 * node + 1 ] ) ;
- }
- ll query(ll left , ll right , ll first, ll last , ll node) {
- if(last < left || right < first)
- return 1e18;
- if(left <= first and right >= last) {
- return seg_tree[node] ;
- }
- ll mid = (first + last) >> 1 ;
- ll p1 = query(left ,right , first , mid , 2 * node ) ;
- ll p2 = query(left , right , mid + 1 , last, 2 * node + 1 ) ;
- return min(p1 , p2) ;
- }
- void update(ll first , ll last , ll node , ll pos , ll val ) {
- if(first == last and first == pos) {
- seg_tree[node] = val;
- return ;
- }
- if(last < pos || first > pos )
- return ;
- ll mid = (first + last ) / 2 ;
- update(first , mid , 2 * node , pos ,val ) ;
- update(mid + 1 , last , 2 * node + 1 ,pos , val ) ;
- seg_tree[node] = min (seg_tree[2 * node] , seg_tree[2 * node + 1 ] ) ;
- }
- int main()
- {
- int n ;
- cin >> n ;
- for(int i = 1 ;i <= n ;i++) {
- cin >> a[i] ;
- }
- build(1 , n , 1) ;
- int q ;
- cin >> q ;
- while(q--) {
- int x , y ,z ;
- cin >> z ;
- if(z == 1) {
- cin >> x >> y ;
- cout << query(x , y , 1 , n , 1) ;
- }
- else {
- int pos , val ;
- cin >> pos >> val ;
- update(1 , n , 1 , pos , val ) ;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment