Cod sursa(job #1758295)

Utilizator titusuTitus C titusu Data 16 septembrie 2016 22:35:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#define NN 100000
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,m, v[NN + 1], A[4 * NN + 100];

void Init(int k, int st, int dr){
    if(st == dr)
        A[k] = v[st];
    else
    {
        int m = (st + dr) / 2;
        Init(2 * k, st , m);
        Init(2 * k + 1 , m + 1, dr);
        A[k] = max(A[2 * k] , A[2 * k + 1]);
    }
}

void Update(int i, int x, int k, int st, int dr){
    if(st == dr)
        A[k] = x;
    else
    {
        int m = (st + dr) / 2;
        if(i <= m)
            Update(i, x, 2 * k , st , m);
        else
            Update(i, x, 2 * k + 1, m + 1, dr);
        A[k] = max(A[2 * k], A[2 * k + 1]);
    }
}

int Query(int i, int j, int k, int st, int dr){
    if(i == st && j == dr)
        return A[k];
    int m = (st + dr) / 2;
    if(j <= m)
        return Query(i, j, 2 * k, st , m);
    if(i > m)
        return Query(i, j, 2 * k + 1, m + 1, dr);
    return max(Query(i, m, 2 * k, st, m), Query(m + 1, j, 2 * k + 1, m + 1, dr));
}

int main(){
    fin >> n >> m;
    for(int i = 1 ; i <= n ; i  ++)
        fin >> v[i];
    Init(1 , 1, n);
    for( ; m ; m --)
    {
        int op, x, y;
        fin >> op >> x >> y;
        if(op == 1){
            v[x] = y;
            Update(x,y,1,1,n);
        }
        else
            fout << Query(x,y,1,1,n) << "\n";
    }
}