Cod sursa(job #2420375)

Utilizator capmareAlexCapmare Alex capmareAlex Data 11 mai 2019 17:24:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[NMAX],aint[NMAX*4];
int n,m;
void build(int nod, int l, int r)
{
    if(l==r)aint[nod]=v[l];
    else
    {
        int m=(l+r)>>1;
        build(nod*2,l,m);
        build(nod*2+1,m+1,r);
        aint[nod]= aint[nod*2] > aint[nod*2+1]? aint[nod*2] :aint[nod*2+1];
    }
}
void update(int nod, int l, int r, int poz)
{
    if(l==r)aint[nod]=v[l];
    else
    {
        int m=(l+r)>>1;
        if(poz<=m)update(nod*2,l,m,poz);
        else update(nod*2+1,m+1,r,poz);
        aint[nod]=max(aint[nod*2],aint[nod*2+1]);
    }
}
int query(int nod, int l, int r, int b, int c)
{
    if(b<=l&&c>=r)return aint[nod];
    else
    {
        int mid=(l+r)>>1;
        int mx1=-1,mx2=-1;
        if(mid>=b) mx1=query(nod*2,l,mid,b,c);
        if(mid+1<=c)mx2=query(nod*2+1,mid+1,r, b,c);
        return max(mx1,mx2);

    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)fin>>v[i];
    build(1,1,n);
    for( int i=1;i<=m;++i)
    {
        int a,b,c;
        fin>>a>>b>>c;
        if(a==1)
        v[b]=c,update(1,1,n,b);
        else fout<<query(1,1,n,b,c)<<"\n";
    }
    return 0;
}
//by capmare alex nu copia ma omule!!