Cod sursa(job #2902513)

Utilizator adamemi02emanuel adam adamemi02 Data 16 mai 2022 15:42:33
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
=
#include<fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int arb[300000],a[100001];
void arbore(int index,int stanga,int dreapta)
{
    if(stanga==dreapta)
    {
        arb[index]=a[stanga];
        return;

    }
    int mijloc=(stanga+dreapta)/2;
    arbore(2*index,stanga,mijloc);
    arbore(2*index+1,mijloc+1,dreapta);

    arb[index]=max(arb[index*2+1],arb[index*2]);

}

int maxim(int index,int stanga,int dreapta,int a,int b)
{
    if(b<stanga || a>dreapta)
        return 0;
    if(a<=stanga && b>=dreapta)
        return arb[index];

    int mijloc=(stanga+dreapta)/2;

    return max(maxim(2*index,stanga,mijloc,a,b),maxim(2*index+1,mijloc+1,dreapta,a,b));
}

void update(int index,int stanga,int dreapta,int val)
{
    if(val<stanga||val>dreapta)
        return;
    if(stanga==dreapta)
    {arb[index]=a[dreapta];
        return;}
    int mijloc=(stanga+dreapta)/2;
    update(index*2,stanga,mijloc,val);
    update(index*2+1,mijloc+1,dreapta,val);

    arb[index]=max(arb[index*2],arb[index*2+1]);
}
int main() {
    int N,Q;
    cin>>N>>Q;
    for(int i=1;i<=N;i++)
        cin>>a[i];

    arbore(1,1,N);


    for(int i=1;i<=Q;i++)
    {
        int x,x1,x2;
        cin>>x>>x1>>x2;
        if(x==0)
        {
            cout<<maxim(1,1,N,x1,x2)<<"\n";
        }
        else{
            a[x1]=x2;
            update(1,1,N,x1);

        }
    }


}