Pagini recente » Cod sursa (job #1566317) | Cod sursa (job #2042421) | Cod sursa (job #1539505) | Cod sursa (job #1800656) | Cod sursa (job #2388849)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1<<18;
int n, m, aint[N], st, dr, tip, i, v, z, get_max(int, int, int);
void upd(int, int);
int main()
{
f >> n >> m;
z = 1;
while(z < n)
z*=2;
z--;
for(int i = 1; i <= n; i++)
f >> aint[z + i];
for(int i = z; i >= 1; i--)
aint[i] = max(aint[2*i], aint[2*i + 1]);
for(; m; m--)
{
f >> tip;
if(!tip)
{
f >> st >> dr;
g << get_max(1, 1, z+1) << '\n';
continue;
}
f >> i >> v;
upd(i+z, v);
}
return 0;
}
int get_max(int nod,int lo,int hi)
{
/// [lo,hi] = intervalul controlat de nod
/// [st,dr] = intervalul chestionat ( st si dr globale )
if(lo>dr||st>hi) return 0;
if(st<=lo&&hi<=dr)return aint[nod];
int mi=(lo+hi)/2;
return max(get_max(2*nod,lo,mi),get_max(2*nod+1,mi+1,hi));
}
void upd(int nod,int val)
{
aint[nod]=val;
for(nod/=2;nod;nod/=2)aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}