Pagini recente » Cod sursa (job #1754782) | Cod sursa (job #1282035) | Cod sursa (job #1211054) | Cod sursa (job #1423612) | Cod sursa (job #2541719)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=1000010;
int n, v[NMAX], q;
int arb[NMAX*10];
struct INTERVAL{
int st,dr;
}interval[NMAX];
void citire()
{
fin>>n>>q;
for (int i=1; i<=n; i++)
fin>>v[i];
}
void creareArbore(int rad, int st, int dr)
{
if (st==dr){
interval[rad].st=st;
interval[rad].dr=dr;
arb[rad]=v[st];
}else{
interval[rad].st=st;
interval[rad].dr=dr;
int mij=(st+dr)/2;
creareArbore(2*rad,st,mij);
creareArbore(2*rad+1,mij+1,dr);
arb[rad]=max(arb[2*rad],arb[2*rad+1]);
}
}
int query(int rad, int st, int dr)
{
if (interval[rad].st>dr || interval[rad].dr<st)
return -1;
if (interval[rad].st>=st && interval[rad].dr<=dr)
return arb[rad];
int mij=(st+dr)/2;
return max(query(2*rad,st,dr),query(2*rad+1,st,dr));
}
void update(int rad, int x, int val)
{
if (interval[rad].st==x && interval[rad].dr==x){
v[x]=val;
arb[rad]=val;
}else{
int mij=(interval[rad].st+interval[rad].dr)/2;
if (interval[rad].st<=x && x<=mij){
update(2*rad,x,val);
}else if (interval[rad].dr>=x && x>mij)
update(2*rad+1,x,val);
arb[rad]=max(arb[2*rad],arb[2*rad+1]);
}
}
void rezolvare()
{
int c, x, y;
for (int i=1; i<=q; i++){
fin>>c>>x>>y;
if (c==0)
fout<<query(1,x,y)<<'\n';
else
update(1,x,y);
}
}
int main()
{
citire();
creareArbore(1,1,n);
rezolvare();
}