Cod sursa(job #1698149)

Utilizator lflorin29Florin Laiu lflorin29 Data 3 mai 2016 20:47:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

int n, m, a[1 << 19], aint[1 << 19];

void build(int l = 1, int r = n, int id = 1) {
   if(l == r) {
      aint[id] = a[l];
      return;
   }

   int mij = (l + r) / 2;
   build(l, mij, id * 2);
   build(mij + 1, r, id * 2 + 1);
   aint[id] = max(aint[id * 2 + 1], aint[id * 2]);
}

void update(int pos, int val, int l = 1, int r = n, int id = 1)
{
   if(pos > r || pos < l || l > r)
      return;
   if(l == r)
   {
      aint[id] = val;
      return;
   }

   int mij = (l + r) / 2;
   update(pos, val, l, mij, id * 2);
   update(pos, val, mij + 1, r, id * 2 + 1);
   aint[id] = max(aint[id * 2], aint[id * 2 + 1]);
}

int query (int x, int y, int l = 1, int r = n, int id = 1)
{
   if(l > r || r < x || y < l)
      return 0;
   if(l >= x && r <= y)
      return aint[id];
   int mij = (l + r) / 2;
   return max(query(x, y, l, mij, id * 2), query(x, y, mij + 1, r, id * 2 + 1));
}

int main()
{
   freopen("arbint.in", "r", stdin);
   freopen("arbint.out", "w", stdout);

   scanf("%d %d", &n, &m);
   for(int i = 1; i <= n; i++)
       scanf("%d", &a[i]);
   build();

   while (m--)
   {
      int op, x, y;
      scanf("%d %d %d", &op, &x, &y);
      if(op == 1)
         update(x, y), a[x] = y;
      else printf("%d\n", query(x, y));
   }

   return 0;
}