Cod sursa(job #3257560)

Utilizator AnderManStaneci-Barbieru Andrei AnderMan Data 18 noiembrie 2024 14:37:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb

#include <bits/stdc++.h>
using namespace std;

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

int n, m;
int v[100000001], s[100000001];

void mt(int i, int p, int q){
    if(p==q){
        s[i]=v[p];
    }else{
        int mij=(p+q)/2;
        mt(i*2, p, mij);
        mt(i*2+1, mij+1, q);
        s[i]=max(s[i*2], s[i*2+1]);
    }
}

int suma(int i, int p, int q, int a, int b){
    if(a<=p && q<=b){
        return s[i];   
    }else{
        int mij=(p+q)/2;
        int x=0, y=0;
        if(a<=mij){
            x=suma(i*2, p, mij, a, b); 
        }
        if(mij<b){
            y=suma(i*2+1, mij+1, q, a, b);
        }
        return max(x, y);
    }
}

void update(int i, int p, int q, int a, int b){
    if(p==q && q==a){
        s[i]=b;
    }else{
        int mij=(p+q)/2;
        if(a<=mij){
            update(i*2, p, mij, a, b);
        }else{
            update(i*2+1, mij+1, q, a, b);
        }
        s[i]=max(s[i*2], s[i*2+1]);
    }
}

int main()
{
    int i, op, a, b;
    fin>>n>>m;
    for(i=1;i<=n;++i){
        fin>>v[i];
    }
    mt(1, 1, n);
    for(i=1;i<=m;++i){
        fin>>op>>a>>b;
        if(op==1){
            v[a]=b;
            update(1, 1, n, a, b);
        }else if(op==0){
            fout<<suma(1, 1, n, a, b)<<endl;
        }
    }

    return 0;
}