Cod sursa(job #2935174)

Utilizator gianifer1Spita Alexandru-Mihai gianifer1 Data 6 noiembrie 2022 13:03:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>

using namespace std;
int v[100010],A[400010];
int n,m,sol,a,b,i,j,operatie;
inline int maxim(int x,int y)
{if(x>y)
return x;
return y;
}
void build(int nod,int st,int dr)
{if(st==dr)
A[nod]=v[st];
else{
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
}
void update(int nod,int st,int dr,int poz,int x)
{if(st==dr)
A[nod]=x;
else{
    int mij=(st+dr)/2;
    if(poz<=mij)
    update(2*nod,st,mij,poz,x);
    else update(2*nod+1,mij+1,dr,poz,x);
    A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
}
void query(int nod,int st,int dr,int a_st,int b_dr)
{if(a_st<=st && dr<=b_dr)
sol=maxim(sol,A[nod]);
else{
    int mij=(st+dr)/2;
    if(a_st<=mij)
    query(2*nod,st,mij,a_st,b_dr);
    if(b_dr>=mij+1)
    query(2*nod+1,mij+1,dr,a_st,b_dr);
}
}
int main()
{ifstream fin("arbint.in");

ofstream fout("arbint.out");
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
    fin>>operatie>>a>>b;
    if(operatie==1){
        update(1,1,n,a,b);
    }
    else{
        sol=0;
        query(1,1,n,a,b);
        fout<<sol<<endl;
    }
}
return 0;
}