Cod sursa(job #2690659)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 25 decembrie 2020 09:24:35
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMAX = 100000;

class InParser {

private:

  static const int buff_size = 1 << 16;
  char buffer[buff_size];
  int buff_pointer;
  FILE *infile;

  char get_char() {
    if(buff_pointer == buff_size) {
      buff_pointer = 0;
      fread(buffer, sizeof(buffer[0]), buff_size, infile);
    }

    return buffer[buff_pointer++];
  }

public:

  InParser(const char* file_name) {
    infile = fopen(file_name, "r");
    buff_pointer = buff_size;
  }

  InParser& operator >> (int &nr) {
    char ch;
    nr = 0;

    do {
      ch = get_char();
    } while(ch < '0' || ch > '9');

    while(ch >= '0' && ch <= '9') {
      nr = nr * 10 + ch - '0';
      ch = get_char();
    }

    return *this;
  }

  void close() {
    fclose(infile);
  }

};

class OutParser {

private:
  static const int buff_size = 1 << 16;
  char buffer[buff_size];
  int buff_pointer;
  FILE *outfile;

public:

  OutParser(const char* file_name) {
    outfile = fopen(file_name, "w");
    buff_pointer = 0;
  }

  OutParser& operator << (int nr) {
    int cf[10], nr_cf = 0;

    while(nr) {
      cf[nr_cf++] = nr % 10;
      nr /= 10;
    }

    for(int i = nr_cf - 1; i >= 0; i--)
      buffer[i] = cf[i] + '0';

    buff_pointer = nr_cf;
    fwrite(buffer, 1, buff_pointer, outfile);

    return *this;
  }

  OutParser& operator << (char ch) {
    buffer[0] = ch;
    buff_pointer = 1;
    fwrite(buffer, 1, buff_pointer, outfile);

    return *this;
  }

};

int n, m;
int aint[2 * NMAX + 5];

void build() {
  for(int i = n - 1; i; i--)
    aint[i] = max(aint[i << 1], aint[(i << 1) + 1]);
}

void update(int poz, int val) {
  aint[poz += n - 1] = val;
  for(poz >>= 1; poz; poz >>= 1)
    aint[poz] = max(aint[poz << 1], aint[(poz << 1) + 1]);
}

int query(int st, int dr) {
  int ans = -1;
  for(st += n - 1, dr += n - 1; st <= dr; st >>= 1, dr >>= 1) {
    if(st & 1)
      ans = max(ans, aint[st++]);
    if(!(dr & 1))
      ans = max(ans, aint[dr--]);
  }
  return ans;
}

int main() {
  InParser in("arbint.in");
  OutParser out("arbint.out");

  in >> n >> m;
  for(int i = 0; i < n; i++)
    in >> aint[n + i];

  build();

  for(int i = 1; i <= m; i++) {
    int tip, a, b;
    in >> tip >> a >> b;

    if(!tip)
      out << query(a, b) << '\n';
    else
      update(a, b);
  }

  in.close();
  //out.close();

  return 0;
}