Cod sursa(job #2794423)

Utilizator alextmAlexandru Toma alextm Data 4 noiembrie 2021 20:29:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100001;

class Reader {
public:
    Reader(const string& filename):
            m_stream(filename),
            m_pos(kBufferSize - 1),
            m_buffer(new char[kBufferSize]) {
      next();
    }

    Reader& operator>>(int& value) {
      value = 0;
      while (current() < '0' || current() > '9')
        next();
      while (current() >= '0' && current() <= '9') {
        value = value * 10 + current() - '0';
        next();
      }
      return *this;
    }

private:
    const int kBufferSize = 32768;

    char current() {
      return m_buffer[m_pos];
    }

    void next() {
      if (!(++m_pos != kBufferSize)) {
        m_stream.read(m_buffer.get(), kBufferSize);
        m_pos = 0;
      }
    }

    ifstream m_stream;
    int m_pos;
    unique_ptr<char[]> m_buffer;
};

class Writer {
public:
    Writer(const string& filename):
            m_stream(filename),
            m_pos(0),
            m_buffer(new char[kBufferSize]) {}

    Writer& operator<<(int value) {
      char digits[10];
      int nr = 0, q;
      do {
        q = value / 10;
        digits[nr++] = value - (q << 1) - (q << 3) + '0';
        value = q;
      } while (value);

      while (nr--) {
        m_buffer[m_pos++] = digits[nr];
        if (m_pos == kBufferSize) Flush();
      }

      return *this;
    }

    Writer& operator<<(char value) {
      m_buffer[m_pos++] = value;

      if (m_pos == kBufferSize) Flush();

      return *this;
    }

    void Flush(){
      m_stream.write(m_buffer.get(), m_pos);
      m_pos = 0;
    }

private:
    const int kBufferSize = 32768;

    ofstream m_stream;
    int m_pos;
    unique_ptr<char[]> m_buffer;
};

int tree[MAXN * 2], n, m;

void Build() {
  for(int i = n - 1; i > 0; i--)
    tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}

void Update(int pos, int val) {
  tree[pos += n] = val;
  for(pos /= 2; pos >= 1; pos /= 2)
    tree[pos] = max(tree[pos * 2], tree[pos * 2 + 1]);
}

int Query(int st, int dr) {
  int res = 0;
  for(st += n, dr += n; st <= dr; st /= 2, dr /= 2) {
    if(st & 1) res = max(res, tree[st++]);
    if(!(dr & 1)) res = max(res, tree[dr--]);
  }
  return res;
}

int main() {
  Reader fin("arbint.in");
  Writer fout("arbint.out");

  fin >> n >> m;
  for(int i = 0; i < n; i++)
    fin >> tree[i + n];

  Build();

  for(int i = 0; i < m; i++) {
    int t, a, b;
    fin >> t >> a >> b;
    if(t == 0)
      fout << Query(a - 1, b - 1) << '\n';
    else
      Update(a - 1, b);
  }

  fout.Flush();
  return 0;
}