Pagini recente » Cod sursa (job #1507333) | Cod sursa (job #2776930) | Cod sursa (job #1457657) | Cod sursa (job #535678) | Cod sursa (job #2001387)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N=100010;
struct nod
{
int val;
nod *fs,*fd,*ta;
};
nod *F[N],*root,*constr(nod*,int,int);
int n,m,i,a,b,c,ask(nod*,int,int);
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
int x;f>>x;
F[i]=new nod;
F[i]->val=x;
F[i]->fs=F[i]->fd=F[i]->ta=NULL;
}
root=constr(NULL,1,n);
for(;m;m--)
{
f>>c>>a>>b;
if(c)
{
nod* aux;
F[a]->val=b;
for(aux= F[a]->ta;aux;aux=aux->ta)
aux->val=max(aux->fs->val,aux->fd->val);
}
else g<<ask(root,1,n)<<'\n';
}
return 0;
}
nod *constr(nod *t,int st,int dr)
{
int mi=(st+dr)/2;nod *aux;aux=new nod;
if(st==dr){F[st]->ta=t;return F[st];}
aux->fs=constr(aux,st,mi);
aux->fd=constr(aux,mi+1,dr);
aux->ta=t;
aux->val=max(aux->fs->val,aux->fd->val);
return aux;
}
int ask(nod *nd,int lo,int hi)
{
if(b<lo||hi<a)return 0;
if(a<=lo&&hi<=b)return nd->val;
int mi=(lo+hi)/2;
return max(ask(nd->fs,lo,mi),ask(nd->fd,mi+1,hi));
}