Cod sursa(job #916694)

Utilizator freak93Adrian Budau freak93 Data 16 martie 2013 19:43:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdio>
#include <cassert>
#include <cstring>

using namespace std;

class SegmentTree {
  public:
    SegmentTree(const vector<int>& input) {
        size_ = 1;
        while (size_ < input.size())
            size_ *= 2;
        data_ = new int[size_ * 2];

        for (size_t i = 0; i < input.size(); ++i)
            data_[size_ + i] = input[i];
        for (size_t i = input.size(); i < size_; ++i)
            data_[size_ + i] = 0;
        
        for (size_t i = size_ - 1; i; --i)
            data_[i] = max(data_[i * 2], data_[i * 2 + 1]);
    }

    void update(int where, const int &value) {
        where += size_;
        data_[where] = value;
        for (where /= 2; where > 0; where /= 2)
            data_[where] = max(data_[where * 2], data_[where * 2 + 1]);
    }

    int query(int from, int to) {
        int answer = 0;
        from += size_;
        to += size_;
        while (from <= to) {
            answer = max(answer, data_[from]);
            from = (from + 1) / 2;

            answer = max(answer, data_[to]);
            to = (to - 1) / 2;
        }

        return answer;
    }

    ~SegmentTree() {
        delete[] data_;
    }

  private:
    size_t size_;
    int* data_;
};

class Reader {
  public:
    Reader(const int &size = 32768):
        size_(size) {
            assert(freopen("arbint.in", "r", stdin) != NULL);
            buffer_ = new char[32768];
            memset(buffer_, 0, sizeof(buffer_));
            pointer_ = size_ - 1;
        }
     
    Reader& operator>>(int &value) {
        value = 0;
        bool negative = false;
        while ((current() < '0' || current() > '9') && current() != '-')
            next();
 
        if (buffer_[pointer_] == '-') {
            negative = true;
            next();
        }
 
        while (current() >= '0' && current() <= '9') {
            value = value * 10 + current() - '0';
            next();
        }
 
        if (negative)
            value = -value;
        return *this;
    }
 
  private:
    char current() {
        return buffer_[pointer_];
    }
 
    void next() {
        if (++pointer_ == size_) {
            assert(fread(buffer_, 1, size_, stdin) != 0);
            pointer_ = 0;
        }
    }
 
    int size_;
    int pointer_;
    char *buffer_;
};

int main() {
    Reader cin;
    ofstream cout("arbint.out");

    int N, M; cin >> N >> M;

    vector<int> A(N);
    for (int i = 0; i < N; ++i)
        cin >> A[i];

    SegmentTree S(A);
    for (int i = 0; i < M; ++i) {
        int type, x, y; cin >> type >> x >> y;
        if (type == 0)
            cout << S.query(x - 1, y - 1) << "\n";
        else
            S.update(x - 1, y);
    }
}