Cod sursa(job #1418448)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 13 aprilie 2015 10:09:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

using namespace std;

int a[500004],i,n,tip,q,x,y,maxim;
inline int MAX(int x,int y)
{
    return (x>y?x:y);
}
inline void upd(int nod,int st,int dr,int poz,int val)
{
     if(st==dr)
     {
        a[nod]=val;
        return;
     }
     int mj=(st+dr)/2;
     if(poz<=mj) upd(2*nod,st,mj,poz,val);
     else upd(2*nod+1,mj+1,dr,poz,val);

     a[nod]=MAX(a[2*nod],a[2*nod+1]);
}
inline void Q(int nod,int st,int dr,int x,int y)
{
    if(x<=st && dr<=y)
    {
        if(a[nod]>maxim) maxim=a[nod];
        return;
    }
     int mj=(st+dr)/2;
     if(x<=mj) Q(2*nod,st,mj,x,y);
     if(mj<y) Q(2*nod+1,mj+1,dr,x,y);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
    {
       scanf("%d",&x);
       upd(1,1,n,i,x);
    }
    for(;q;--q)
    {
         scanf("%d%d%d",&tip,&x,&y);

         if(tip==1) upd(1,1,n,x,y);
         else maxim=-1, Q(1,1,n,x,y), printf("%d\n",maxim);
    }
    return 0;
}