Cod sursa(job #2365048)

Utilizator aditzu7Adrian Capraru aditzu7 Data 4 martie 2019 11:53:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <iostream>
using namespace std;
int tip,b,k,j,a2,n,m;
int a[1001*1001];
int arb[1001*1001];
void creare(int nod,int st,int dr){

if(st==dr) arb[nod]=a[st];
else{
  int mij=(st+dr)/2;
 creare(2*nod,st,mij);
 creare(2*nod+1,mij+1,dr);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);

}


}
void update(int nod,int st,int dr,int a,int b){
if(st==dr) arb[nod]=b;
else{
    int mij=(st+dr)/2;
    if(a<=mij) update(2*nod,st,mij,a,b);
    else update(2*nod+1,mij+1,dr,a,b);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}


}
int querry(int nod,int st,int dr,int a,int b){
if(a<=st&&dr<=b) return arb[nod];
else{
int x1,x2,mij=(st+dr)/2;
x1=x2=0;
if(a<=mij) x1=querry(2*nod,st,mij,a,b);
 if(b>mij) x2=querry(2*nod+1,mij+1,dr,a,b);
 return max(x1,x2);

}

}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
creare(1,1,n);
for(k=1;k<=m;k++){
    scanf("%d%d%d",&tip,&a2,&b);
    if(tip==1){update(1,1,n,a2,b);}
else{
        printf("%d\n",querry(1,1,n,a2,b));



}
}
    return 0;
}