Cod sursa(job #1420559)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 18 aprilie 2015 18:12:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
// Arbori intervale - O(logN) pe operatie

#include <fstream>
#define Nmax 100099
#define oo 2000000000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N, M, v[Nmax], MAX[4*Nmax], MIN[4*Nmax], sol, A, B, val;

void upd(const int& node, const int& st, const int& dr) {
   if (st == dr){
        MAX[node] = MIN[node] = val;
        return;
   }

   int mij = (st+dr) >> 1 , s1=node<<1, s2=s1+1;
   
   if(A <= mij)upd(s1, st,    mij);
          else upd(s2, mij+1, dr);
   
   if(MAX[s1] > MAX[s2]) MAX[node] = MAX[s1];
                  else   MAX[node] = MAX[s2];
  /*
   if(MIN[s1] < MIN[s2]) MIN[node] = MIN[s1];
                  else   MIN[node] = MIN[s2];
  */
}

void query(const int& node, const int& st, const int& dr) {
   if(A <= st && dr <= B) {
        if(MAX[node] > sol) sol = MAX[node];
        /* if(MIN[node] < solmin) solmin = min[node] */;
        return;
   }
   int mij = (st+dr) >> 1 , s1 = node<<1, s2 = s1+1;
   if(A <= mij) query(s1, st,    mij);
   if(mij < B)  query(s2, mij+1, dr);
}

int main() {
  f >> N >> M;

   /* init */
  for(int i = 1; i <= N; ++i) {
    f>>val;
    A = B = i;
    upd(1, 1, N);
  }

  for(int i=1;i<=M;++i) {
    int x, y, op;
    f >> op >> x >> y;
    if(op == 1) {
      A = B = x;
      val = y;
      upd(1, 1, N);
    }
    else {
      A = x;
      B = y;
      sol = 0;
      query(1, 1, N);
      g << sol << '\n';
    }
  }
  f.close();g.close();
  return 0;
}