Pagini recente » Cod sursa (job #990028) | Cod sursa (job #1694525) | Cod sursa (job #291737) | Cod sursa (job #1339730) | Cod sursa (job #749596)
Cod sursa(job #749596)
#include<cstdio>
#define NMAX 400500
#define maxim(a,b) ((a>b)?(a):(b))
using namespace std;
int SegT[NMAX];
int Sol,A,B,N,k,M;
int left_son(int nod)
{
return nod<<1;
}
int right_son(int nod)
{
return (nod<<1)+1;
}
bool verif(int left)
{
if(left<=k)
return true;
return false;
}
void update(int nod, int left, int right)
{
if(left==right)
{
SegT[nod]=B;
return;
}
int mid;
mid=left+(right-left)/2;
if(A<=mid)
update(left_son(nod),left,mid);
else
update(right_son(nod),mid+1,right);
if(verif(mid+1))
SegT[nod]=maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
else
SegT[nod]=SegT[left_son(nod)];
}
void query(int nod, int left, int right)
{
if(A<=left && right<=B)
{
Sol=maxim(Sol,SegT[nod]);
return;
}
int mid;
mid=left+(right-left)/2;
if(A<=mid)
query(left_son(nod),left,mid);
if(B>mid)
query(right_son(nod),mid+1,right);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&N,&M);
for(k=1;k<=N;k++)
{
scanf("%d",&B);
A=k;
update(1,1,N);
}
int op;
while(M--)
{
scanf("%d %d %d",&op,&A,&B);
if(op==0)
{
Sol=-1;
query(1,1,N);
printf("%d\n",Sol);
}
else
update(1,1,N);
}
return 0;
}