Cod sursa(job #1605664)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 19 februarie 2016 12:39:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;

class arbint{
    int n;
    vector<int> buf;
public:
    arbint(const vector<int>& v): n(v.size()), buf(2*n, 0){
        copy(v.begin(), v.end(), buf.begin()+n);
        for(int i = n-1; i > 0; --i){
            buf[i] = max(buf[2*i], buf[2*i+1]);
        }
    }
    void update(int p, const int v){
        buf[p+=n] = v;
        for(p /= 2; p > 0; p /= 2){
            buf[p] = max(buf[2*p], buf[2*p+1]);
        }
    }
    int query(int st, int dr){
        int rez = -1;
        for(st += n, dr += n+1; st < dr; st /= 2, dr /= 2){
            if(st%2 == 1){
                rez = max(rez, buf[st++]);
            }
            if(dr%2 == 1){
                rez = max(rez, buf[--dr]);
            }
        }
        return rez;
    }
};

int main(){
    ifstream f("arbint.in");
    ofstream g("arbint.out");

    int n, m;
    f >> n >> m;

    vector<int> v(n);

    for(int i = 0; i < n; ++i){
        f >> v[i];
    }

    arbint ai(v);

    for(int i = 0, t, a, b; i < m; ++i){
        f >> t >> a >> b;
        if(t == 0){
            g << ai.query(a-1, b-1) << '\n';
        }
        else{
            ai.update(a-1, b);
        }
    }
    return 0;
}