Cod sursa(job #2392839)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 30 martie 2019 14:58:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <cstdio>
#define N 100005
using namespace std;

int n,m,c,a,b;
int s[N], arbint[4*N];

void construieste(int st = 1, int dr = n, int pos = 1){
    if(st==dr){
        arbint[pos] = s[st];
        return ;
    }
    int mij = (st+dr)/2;
    construieste(st,mij,2*pos);
    construieste(mij+1,dr,2*pos+1);
    arbint[pos]=max(arbint[2*pos],arbint[2*pos+1]);
}

void actualizare(int k, int st = 1, int dr = n, int pos = 1){
    if(st==dr){
        arbint[pos] = s[k];
        return ;
    }
    int mij = (st+dr)/2;
    if(k<=mij)
        actualizare(k,st,mij,2*pos);
    else
        actualizare(k,mij+1,dr,2*pos+1);
    arbint[pos]=max(arbint[2*pos],arbint[2*pos+1]);
}

int cauta(int st = 1, int dr = n, int pos = 1){
    if(a<=st && dr<=b)
        return arbint[pos];
    int mij=(st+dr)/2;
    if(b<=mij)
        return cauta(st,mij,2*pos);
    if(a>mij)
        return cauta(mij+1,dr,2*pos+1);
    return max(cauta(st,mij,2*pos),
                cauta(mij+1,dr,2*pos+1));
}

int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d", &n,&m);
    for(int i=1;i<=n;++i)
        scanf("%d", &s[i]);

    construieste();

    for(int i=0;i<m;++i){
        scanf("%d%d%d", &c,&a,&b);
        if(c==1){
            s[a]=b;
            actualizare(a);
        }else
            printf("%d\n", cauta());
    }

    return 0;
}