Cod sursa(job #2816666)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 11 decembrie 2021 20:51:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cmath>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

const int MAXN = 100000;
const int MAXA = MAXN * 2;

int a[MAXA];
int size_a;

int v[MAXN];

void arbore( int left, int right, int nodeIndex ){
  if( left == right ){
    a[nodeIndex] = v[left];
    //cout<<nodeIndex<<" "<<left<<" "<<v[left]<<'\n';
    return;
  }

  int mid, leftChild, rightChild;
  //cout<<"ininte: "<<left<<" "<<mid<<" "<<right<<'\n';
  mid = ( right + left ) / 2;
  leftChild = nodeIndex + 1;
  rightChild = nodeIndex + ( mid - left + 1) * 2;

  //cout<<"dupa: "<<left<<" "<<mid<<" "<<right<<'\n';

  arbore(left, mid, leftChild);
  arbore(mid + 1, right, rightChild);

  a[nodeIndex] = max(a[rightChild], a[leftChild]);
  //cout<<"maxim: "<<a[nodeIndex]<<" "<<nodeIndex<<'\n';
}

int query( int indexNode, int left, int right, int index1, int index2 ){
  if( left >= index1 && index2 >= right ){
    //out<<indexNode<<'\n';
    return a[indexNode];
  }

  int maxim;
  int mid, leftChild, rightChild;

  mid = ( left + right ) / 2;
  leftChild = indexNode + 1;
  rightChild = indexNode + ( mid - left + 1) * 2;

  //cout<<left<<" "<<mid<<" "<<right<<'\n';

  maxim = -1;
  if(index1 <= mid)
    maxim = max( maxim, query(leftChild, left, mid, index1, index2));
  if( index2 > mid )
    maxim = max( maxim, query(rightChild, mid + 1, right, index1, index2));

  return maxim;
}

void update( int indexNode, int left, int right, int poz, int val ){
  if( left == right ){
    //cout<<a[indexNode]<<" "<<indexNode<<'\n';
    a[indexNode] = val;
    return;
  }

  int mid, leftChild, rightChild;
  mid = ( left + right ) / 2;
  leftChild = indexNode + 1;
  rightChild = indexNode + ( mid - left + 1) * 2;

  if( poz <= mid )
    update( leftChild, left, mid, poz, val);
  else
    update( rightChild, mid + 1, right, poz, val);

  a[indexNode] = max(a[rightChild], a[leftChild]);
}

int main(){
  int n, m, i, c, a, b;
  in>>n>>m;
  for(i = 0; i < n; i++ ){
    in>>v[i];
  }

  arbore(0, n - 1, 0);
  for(i = 0; i < m; i++ ){
    in>>c>>a>>b;

    if( c == 0 )
      out<<query(0, 0, n - 1, a - 1, b - 1)<<'\n';
    else
      update(0, 0, n - 1, a - 1, b);
  }
  return 0;
}