Cod sursa(job #1386640)

Utilizator c0rn1Goran Cornel c0rn1 Data 13 martie 2015 09:47:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

int n, m;

struct interval { int st, mid, dr; };
struct node
{
   interval interv;
   int maxi;
   node *st, *dr;
   node(){}
   node(int stanga, int dreapta)
   {
      interv.st = stanga;
      interv.dr = dreapta;
      maxi = -1;
      if (interv.st != interv.dr){
         interv.mid = (interv.st + interv.dr) / 2;
         this->st = new node(interv.st, interv.mid);
         this->dr = new node(interv.mid + 1, interv.dr);
      }
      else {
         this->st = new node();
         this->dr = new node();
      }
   }
};
node *start;

int pos, val;
void update(node *x)
{
   if (x->interv.st == x->interv.dr){
      x->maxi = val;
      return;
   }
   if (pos <= x->interv.mid)
      update(x->st);
   else
      update(x->dr);

   x->maxi = max(x->st->maxi, x->dr->maxi);
}

int maxim;
interval intervalCitit;
void querry(node *x)
{
   if (intervalCitit.st <= x->interv.st && x->interv.dr <= intervalCitit.dr){
      maxim = max(maxim, x->maxi);
      return;
   }
   if (intervalCitit.st <= x->interv.mid)
      querry(x->st);
   if (x->interv.mid < intervalCitit.dr)
      querry(x->dr);
}

int main()
{
   freopen("arbint.in", "r", stdin);
   freopen("arbint.out", "w", stdout);
   int x, k, a, b;
   scanf("%d %d\n", &n, &m);
   start = new node(1, n);
   for (int i = 1; i <= n; ++i){
      scanf("%d ", &x);
      pos = i;
      val = x;
      update(start);
   }
   for (int i = 1; i <= m; ++i){
      scanf("%d %d %d\n", &k, &a, &b);
      if (k == 1){   /// update
         pos = a;
         val = b;
         update(start);
      }
      else {         /// querry
         maxim = -1;
         intervalCitit.st = a;
         intervalCitit.dr = b;
         querry(start);
         printf("%d\n", maxim);
      }
   }

   return 0;
}