Nu aveti permisiuni pentru a descarca fisierul grader_test8.in
Cod sursa(job #2453976)
Utilizator | Data | 6 septembrie 2019 21:07:41 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.25 kb |
#include <cstdio>
#include <algorithm>
using namespace std;
int r[100001];
int t[400001];
void build(int v,int tl,int tr)
{
if(tl==tr)
t[v]=r[tl];
else
{
int med=(tl+tr)/2;
build(v*2,tl,med);
build(v*2+1,med+1,tr);
t[v]=max(t[2*v],t[2*v+1]);
}
}
int query(int v,int tl,int tr,int l,int r)
{
if(l>r)
return 0;
if(l==tl && r==tr)
return t[v];
int med=(tl+tr)/2;
return max(query(v*2,tl,med,l,min(r,med)),query(v*2+1,med+1,tr,max(med+1,l),r));
}
void update(int v,int tl,int tr,int p,int nv)
{
if(tl==tr)
t[v]=nv;
else
{
int med=(tl+tr)/2;
if(p<=med)
update(2*v,tl,med,p,nv);
else
update(2*v+1,med+1,tr,p,nv);
t[v]=max(t[2*v],t[2*v+1]);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int m,n;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&r[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int t,a,b;
scanf("%d%d%d",&t,&a,&b);
if(t==0)
printf("%d\n",query(1,1,n,a,b));
else
update(1,1,n,a,b);
}
return 0;
}