Cod sursa(job #2777925)

Utilizator francescom_481francesco martinut francescom_481 Data 26 septembrie 2021 10:58:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include<bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout

#define N 100005
int arborint[N*4], n, m, x, cerinta, a, b;

void update(int poz,int val, int nod, int in, int sf)
{
    if(in == sf)
    {
        if(in  == poz)arborint[nod] = val;
        return ;
    }
    int mij = (in+sf)/2;
    if(in <= poz  &&  poz <= mij)update(poz,val,2*nod,in,mij);
    if(mij < poz  &&  poz <= sf)update(poz,val,2*nod+1,mij+1,sf);
    arborint[nod] = max(arborint[2*nod],arborint[2*nod+1]);
}
int query(int st, int dr, int nod, int in, int sf)
{
    if(st <= in  &&  dr >= sf)
        return arborint[nod];
    int mij = (in+sf)/2;
    if(mij < st)
    {
        return query(st,dr,2*nod+1,mij+1,sf);
    }
    if(mij >= dr)
    {
        return query(st,dr,2*nod,in,mij);
    }
    return max(query(st,dr,2*nod+1,mij+1,sf),query(st,dr,2*nod,in,mij));
}

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x;
        update(i,x,1,1,n);
    }
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> cerinta >> a >> b;
        if(cerinta == 1)
        {
            update(a,b,1,1,n);
        }
        else
        {
            cout << query(a,b,1,1,n) << '\n';
        }
    }
    return 0;
}