Pagini recente » Cod sursa (job #1888748) | Cod sursa (job #962223) | Cod sursa (job #1306465) | Cod sursa (job #896300) | Cod sursa (job #2550352)
#include <fstream>
#include <climits>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 131072; ///( 2^17) care este mai mare decat 10^5- datele nr de elemente ale vectorului
const int VMIN = INT_MIN;
int aint[2* NMAX+5]; ///arborele binar de intervale va avea nr de noduri egal cu 2 * n, unde n este cea mai mare putere a lui 2 care satisface urmatoarea expresie
///2 ^(x-1) < n <= 2^x
int putere(int x)
{
int p =1;
while(p <x)
{
p = (p<<1);
}
return p;
}
void update(int poz, int val)
{
aint[poz] = val;
while(poz >=1)
{
poz = (poz >>1);
aint[poz] = max(aint[poz*2], aint[poz*2 +1]);
}
}
int query(int st, int dr)
{
int sol = INT_MIN;
while(st <=dr)
{
if(st % 2 ==1)
{
sol = max(sol, aint[st]);
st ++;
}
if(dr % 2 ==0)
{
sol = max(sol, aint[dr]);
dr--;
}
st = (st >>1);
dr = (dr >>1);
}
return sol;
}
int main()
{
int sizev, n, m, i, x, t, a, b;
fin>>n>>m;
if(n&(n-1)!=0) ///daca n nu este o putere a lui 2, trebuie sa aflu cel mai mic x astfel incat 2^(x-1) < n<= 2^x;
sizev = putere(n);
else
sizev = n;
for(i=1;i<=2*sizev-1; i++)
aint[i] = VMIN;
for(i=1;i<=n;i++)
{
fin>>x;
update(i + sizev - 1, x);
}
for(i=1;i<=m;i++)
{
fin>>t;
if(t==0)
{
fin>>a>>b;
fout<<query(a + sizev -1, b + sizev -1)<<"\n";
}
else
{
fin>>a>>b;
update(a + sizev -1, b);
}
}
return 0;
}