Cod sursa(job #2333792)
Utilizator | Data | 1 februarie 2019 22:45:01 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 40 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.65 kb |
#include <iostream>
#include <cstdio>
using namespace std;
const int N=(int)1e5+7;
int t[3*N];
void upd(int nod,int l,int r,int i,int x)
{
if(l==r)
{
t[nod]=x;
}
else
{
int m=(l+r)>>1;
if(i<=m)
{
upd(2*nod+1,l,m,i,x);
}
else
{
upd(2*nod+2,m+1,r,i,x);
}
t[nod]=max(t[2*nod+1],t[2*nod+2]);
}
}
int ask(int nod,int l,int r,int a,int b)
{
if(a<=l && r<=b)
{
return t[nod];
}
else
{
int m=(l+r)>>1;
int res=0;
if(a<=m)
{
res=max(res,ask(2*nod+1,l,m,a,b));
}
if(b>=m+1)
{
res=max(res,ask(2*nod+2,m+1,r,a,b));
}
return res;
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
upd(1,1,n,i,x);
}
while(q--)
{
int t,a,b;
cin>>t>>a>>b;
if(t==0)
{
cout<<ask(1,1,n,a,b)<<"\n";
}
else
{
upd(1,1,n,a,b);
}
}
return 0;
}