Pagini recente » Cod sursa (job #1025490) | Cod sursa (job #1025607) | Cod sursa (job #2658832) | Cod sursa (job #1496101) | Cod sursa (job #2442538)
#include <iostream>
#include <fstream>
#include <math.h>
#define left(index) index*2
#define right(index) index*2+1
#define parent(index) index/2
#define MaxN 262146
using namespace std;
int n,m;
int tree[MaxN];
int array[100001];
void create(int poz,int st,int dr)
{
if(st==dr)
tree[poz]=array[st];
else
{
int mij=(st+dr)/2;
create(left(poz),st,mij);
create(right(poz),mij+1,dr);
tree[poz]=max(tree[left(poz)],tree[right(poz)]);
}
}
int getmax(int poz,int st,int dr,int a,int b)
{
if(a<=st && dr<=b)
return tree[poz];
if(b<st || dr<a)
return -1;
int mij=(st+dr)/2;
int max1 = getmax(left(poz),st,mij,a,b);
int max2 = getmax(right(poz),mij+1,dr,a,b);
return max(max1,max2);
}
int getpoz(int index)
{
int poz=1;
int st=1;
int dr=n;
int mij;
while(st<dr)
{
mij=(st+dr)/2;
if(index<=mij)
{
dr=mij;
poz=left(poz);
}
else
{
st=mij+1;
poz=right(poz);
}
}
return poz;
}
void change(int index,int val)
{
int poz=getpoz(index);
tree[poz]=val;
int Parent,othetchild;
while(poz!=1)
{
Parent = parent(poz);
othetchild = poz ^ 1;
int max1=max(tree[othetchild],tree[poz]);
if(max1==tree[Parent])
break;
tree[Parent]=max1;
poz=Parent;
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(int i=1;i<=n;i++)
f>>array[i];
create(1,1,n);
for(int i=1;i<=m;i++)
{
int c,a,b;
f>>c>>a>>b;
if(c==0)
g<<getmax(1,1,n,a,b)<<'\n';
else
change(a,b);
}
f.close();
g.close();
return 0;
}