Cod sursa(job #2815118)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 9 decembrie 2021 09:29:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <stdio.h>

using namespace std;

#define MAXN 100000

int v[MAXN];
int aint[4 * MAXN];
int leftLim, rightLim;

void build(int left, int right, int loc) {
  int leftSon, rightSon, mid;

  if ( left == right ) {
    aint[loc] = v[left];
    return;
  }

  mid = (left + right) / 2;
  leftSon = loc + 1;
  rightSon = loc + 2 * (mid - left + 1);

  build(left, mid, leftSon);
  build(mid + 1, right, rightSon);

  if ( aint[rightSon] > aint[leftSon] )
    aint[loc] = aint[rightSon];
  else
    aint[loc] = aint[leftSon];
}

int calcAns(int left, int right, int loc) {
  int leftMax, rightMax, leftSon, rightSon, mid;

  if ( leftLim <= left && right <= rightLim ) {
    return aint[loc];
  }

  mid = (left + right) / 2;
  leftSon = loc + 1;
  rightSon = loc + 2 * (mid - left + 1);

  leftMax = rightMax = 0;

  if ( leftLim <= mid ) {
    leftMax = calcAns(left, mid, leftSon);
  }
  if ( rightLim > mid ) {
    rightMax = calcAns(mid + 1, right, rightSon);
  }

  if ( leftMax > rightMax )
    return leftMax;
  return rightMax;
}

void update(int pos, int val, int loc, int left, int right) {
  int leftSon, rightSon, mid;

  if ( left == right ) {
    aint[loc] = val;
    return;
  }

  mid = (left + right) / 2;
  leftSon = loc + 1;
  rightSon = loc + 2 * (mid - left + 1);

  if ( mid >= pos )
    update(pos, val, leftSon, left, mid);
  else
    update(pos, val, rightSon, mid + 1, right);

  if ( aint[rightSon] > aint[leftSon] )
    aint[loc] = aint[rightSon];
  else
    aint[loc] = aint[leftSon];
}

int main() {
  FILE *fin, *fout;
  fin = fopen("arbint.in", "r");
  fout = fopen("arbint.out", "w");

  int n, m, q, a, b, i;

  fscanf(fin, "%d%d", &n, &m);

  for  ( i = 0; i < n; i++ )
    fscanf(fin, "%d", &v[i]);

  build(0, n - 1, 0);

  while ( m-- ) {
    fscanf(fin, "%d%d%d", &q, &a, &b);
    a--;

    if ( q == 0 ) {
      b--;
      leftLim = a;
      rightLim = b;
      fprintf(fout, "%d\n", calcAns(0, n - 1, 0));
    } else {
        v[a] = b;
        update(a, b, 0, 0, n - 1);
    }
  }

  fclose(fin);
  fclose(fout);

  return 0;
}