Pagini recente » Cod sursa (job #2974044) | Cod sursa (job #1491193) | Cod sursa (job #2398376) | Cod sursa (job #809323) | Cod sursa (job #3241590)
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nmax=1e5+1;
int n, m, v[nmax];
int tree[4*nmax];
void build(int node,int st,int dr)
{
if(st==dr)//am ajuns pe frunza
{
tree[node]=v[st];
return;
}
int mij=(st+dr)/2;
build(2*node, st, mij);//in stanga
build(2*node+1, mij+1, dr);//in dreapta
tree[node]=max(tree[2*node], tree[2*node+1]);
}
int pos, val;//pozitia pe care o caut, valoarea noua
void update(int node, int st, int dr)//nodul pe care trebuie sa l schimb, intervalul
{
if(st==dr)//am ajuns pe nodul cautat
{
tree[node]=val;
return;
}
int mij=(st+dr)/2;
if(pos<=mij)
update(2*node, st, mij);//e in intervalul din stanga
else
update(2*node+1, mij+1, dr);//e in intervalul din dreapta
tree[node]=max(tree[2*node], tree[2*node+1]);//dupa ce am facut update revine si se schimba nodurile de deasupra
}
int start, finish, rez;
void query(int node, int st, int dr)
{
if(start<=st && dr<=finish)//interval cautat se afla complet aici
{
rez=max(rez,tree[node]);
return;
}
int mij=(st+dr)/2;
if(start<=mij)
query(2*node,st,mij);//are o parte din fiul stang
if(mij<finish)
query(2*node+1,mij+1,dr);//are o parte din fiul drept
}
int main()
{
int op;
in>>n>>m;
for(int i=1; i<=n; i++)
in>>v[i];
build(1,1,n);
for(int i=1; i<=m; i++)
{
in>>op;
if(op==1)
{
in>>pos>>val;
update(1,1,n);
}
else
{
in>>start>>finish;
rez=0;
query(1,1,n);
out<<rez<<'\n';
}
}
return 0;
}