Mai intai trebuie sa te autentifici.
Cod sursa(job #1652878)
Utilizator | Data | 15 martie 2016 15:59:39 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.89 kb |
#include <iostream>
#include <fstream>
using namespace std;
int n,m,a,b,c,arb[400066],maxx;
ifstream f("arbint.in");
ofstream g("arbint.out");
void upd(int nod, int pos, int x, int l, int r)
{
int m;
if(l==r){arb[nod]=x;return;}
m=(l+r)/2;
if(pos<=m)upd(nod*2,pos,x,l,m);
else upd(nod*2+1,pos,x,m+1,r);
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void query(int nod, int a, int b, int l, int r)
{
if(a<=l&&b>=r){maxx=max(maxx,arb[nod]);return;}
int m=(l+r)/2;
if(a<=m)query(nod*2,a,b,l,m);
if(b>m)query(nod*2+1,a,b,m+1,r);
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;i++)
{
f>>a;
upd(1,i,a,1,n);
}
for(;m;m--)
{
f>>a>>b>>c;
if(!a)
{
maxx=0;
query(1,b,c,1,n);
g<<maxx<<'\n';
}
else upd(1,b,c,1,n);
}
return 0;
}