Pagini recente » Cod sursa (job #1463587) | Cod sursa (job #2028088) | Cod sursa (job #80145) | Cod sursa (job #1617779) | Cod sursa (job #2330007)
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=260000;
int aint[NMAX+5];
int p=1;// prin p voi afla pozitiile unde am intervale elementare(intervale cu u singur element)
void Update(int poz, int val)
{
int cpoz;//pozitia curenta
cpoz=poz+p-1;
aint[cpoz]=val;
cpoz=cpoz>>1;
while(cpoz)
{
aint[cpoz]=max(aint[(cpoz<<1)], aint[(cpoz<<1)+1]);//cpoz<<1=cpoz*2;
cpoz=cpoz>>1;
}
}
//Interogari query
int query(int ind_nod, int st, int dr, int stc, int drc)
{
//dreapta curenata si stanga curenta drc, stc
if(st==stc and dr==drc)
return aint[ind_nod];
else
{
int med=(st+dr)>>1;
if(stc<=med and drc>med)
{
//apelam functia recursiv
return max(query((ind_nod<<1), st, med, stc, med), query((ind_nod<<1)+1, med+1, dr, med+1, drc));
}
else
{
if(stc<=med)
return query((ind_nod<<1), st, med, stc, drc);
else
return query((ind_nod<<1)+1, med+1, dr, stc, drc);
}
}
}
int main()
{
int n, i, x, m, a, b;
bool ok;
fin>>n>>m;
//aflam cea mai mica putere a lui 2, mai mare sau egala cu n
p=1;
while(p<n)
p=(p<<1);//p=p*2;
for(i=1;i<=n;i++)
{
fin>>x;
Update(i, x);
}
for(i=1;i<=m;i++)
{
fin>>ok>>a>>b;
if(ok==0)
fout<<query(1, 1, p, a, b)<<"\n";
else
Update(a, b);
}
return 0;
}