Cod sursa(job #2279752)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 9 noiembrie 2018 22:18:25
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAXVAL 1000000005

using namespace std;

//typedef long T;

class SegmentTree {
public:
   SegmentTree(const vector<int> &arr) {
      N_arr = arr.size();
      seg = vector<int>(N_arr, 0);
      for (int i = 0; i < N_arr; ++i) {
         seg.push_back(arr[i]);
      }

      for (int  i = N_arr - 1; i > 0; --i) {
         seg[i] = max(seg[2 * i], seg[2 * i + 1]);
      }
   }


   void update(int ix, int val) {
      int seg_ix = ix + N_arr;
      seg[seg_ix] = val;
      for (int i = seg_ix; i > 1; i = i / 2) {
         int p = i / 2;
         seg[p] = max(seg[2*p+1], seg[2*p]);
      }
   }

   int query(int l, int r) {
      int ret = -1;
      l += N_arr;
      r += N_arr + 1; //inclusive
      while (l < r) {
         if (l % 2 == 1) {
            ret = max(ret, seg[l]);
            l++;
         }
         if (r % 2 == 1) {
            r--;
            ret = max(ret, seg[r]);
         }
         l = l / 2;
         r = r / 2;
      }
      return ret;
   }

private:
   vector<int> seg;
   int N_arr;
};


int main() {
   ifstream iff("arbint.in");
   ofstream off("arbint.out");
   int N, M;
   iff >> N >> M;
   vector<int> arr;
   for (int  i = 0; i < N; ++i) {
      int n;
      iff >> n;
      arr.push_back(n);
   }

   SegmentTree seg(arr);

   for (int i = 0; i < M; ++i) {
      int t, n1, n2;
      iff >> t >> n1 >> n2;
      if (t == 0) {
         off << seg.query(n1-1,n2-1) << endl;
      } else {
         seg.update(n1-1,n2);
      }
   }
   return 0;
}