Cod sursa(job #1145422)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 18 martie 2014 10:37:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#include <algorithm>
#define N (1<<18)+10
using namespace std;
int n,m,z,i,cod,X,Y,x[N],Query(int,int,int);
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(z=1;;z<<=1)
        if(z>=n)
            break;
    z--;
    for(i=1;i<=n;i++)
        scanf("%d",&x[z+i]);
    for(i=z;i>=1;i--)
        x[i]=max(x[2*i],x[2*i+1]);
    for(;m;m--)
    {
        scanf("%d%d%d",&cod,&X,&Y);
        if(!cod)
            printf("%d\n",Query(1,1,z+1));
        else
        {
            X+=z;
            x[X]=Y;
            for(X>>=1;X;X>>=1)
                x[X]=max(x[2*X],x[2*X+1]);
        }
    }
    return 0;
}
int Query(int nod,int A,int B)
{
    if(A>Y||X>B)return 0;
    if(X<=A&&B<=Y)return x[nod];
    return max(Query(2*nod,A,(A+B)/2),Query(2*nod+1,(A+B)/2+1,B));
}