Pagini recente » Cod sursa (job #632979) | Cod sursa (job #830976) | Cod sursa (job #905093) | Cod sursa (job #2057690) | Cod sursa (job #212096)
Cod sursa(job #212096)
//arbori de intervale
#include <fstream>
#define MAXIMUN 100001
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
long heap[MAXIMUN],n,m,sir[MAXIMUN];
int stanga,dreapta,poz[MAXIMUN];
long maxx=-MAXIMUN;
void citire()
{
fin>>n>>m;
for (int i=1;i<=n;i++)
fin>>sir[i];
}
int maxi(int a,int b)
{
return a>b?a:b;
}
void creeare(int nod,int st,int dr)
{
if (st>dr)
return;
if (st==dr)
{
heap[nod]=sir[st];
poz[st]=nod;
return ;
}
int left=nod<<1;
int right=nod<<1+1;
int mij=(st+dr)>>1;
creeare(left,st,mij);
creeare(right,mij+1,dr);
heap[nod]=maxi(heap[left],heap[right]);
}
void maxim(int nod,int st,int dr)
{
if (stanga<=st && dreapta>=dr)
{
if (maxx<heap[nod])
maxx=heap[nod];
return ;
}
int left=nod<<1;
int right=nod<<1;
int mij=(st+dr)>>1;
if (stanga<=mij)
maxim(left,st,mij);
if (mij<dreapta)
maxim(right,mij+1,dr);
}
void aflare()
{
creeare(1,1,n);
int ok,a,b;
while(m)
{
fin>>ok>>stanga>>dreapta;
if (ok==0)
{
maxx=-1;
maxim(1,1,n);
fout<<maxx<<"\n";
}
else
{
sir[stanga]=dreapta;
creeare(1,1,n);
}
m--;
}
}
int main ()
{
citire();
aflare();
}