Cod sursa(job #1800266)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 7 noiembrie 2016 17:06:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>

int heap[280000];

void update(int ind,int li,int lf,int &i,int &x)
{
    if(li==lf)heap[ind]=x;
    else
    {
        int m=(li+lf)/2;
        if(i<=m)update(2*ind,li,m,i,x);
        else update(2*ind+1,m+1,lf,i,x);
        heap[ind]=heap[2*ind]>heap[2*ind+1]?heap[2*ind]:heap[2*ind+1];
        //expresia conditzionala:    expresie?val_adevar:val_fals
    }
}

int getmax(int i,int li,int lf,int a,int b)
{
    if(a<=li&&lf<=b)return heap[i];
    int m=(li+lf)/2,mx=0,m1;
    if(a<=m)mx=getmax(2*i,li,m,a,b);
    if(b>=m+1)
    {
        m1=getmax(2*i+1,m+1,lf,a,b);
        if(m1>mx)mx=m1;
    }
    return mx;
}

int main()
{
    FILE *f=fopen("arbint.in","r"),*g=fopen("arbint.out","w");
    int n,m,x,a,b,t;
    fscanf(f,"%d%d",&n,&m);
    int i;
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        update(1,1,n,i,x);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&t,&a,&b);
        if(t==0)fprintf(g,"%d\n",getmax(1,1,n,a,b));
        else update(1,1,n,a,b);
    }
    return 0;
}