Cod sursa(job #3231390)

Utilizator catalinaionela77Catalina Ionela Florescu catalinaionela77 Data 26 mai 2024 12:04:11
Problema Arbori de intervale Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100001

int arbore[4*MAX_SIZE+66];

int maxim(int x,int y)
{
    return (x>y) ? x:y;
}

void update(int nod,int st,int dr,int p,int val)
{
    if(st==dr)//este frunza
    {
       arbore[nod]=val;
       return ;
    }
    int mij=(st+dr)/2;
    if(p<=mij)//e in prima jumatate
        update(2*nod,st,mij,p,val);
    else//e in a doua jum
        update(2*nod+1,mij,dr,p,val);
    arbore[nod]=maxim(arbore[2*nod],arbore[2*nod+1]);
}

int query(int nod,int st,int dr,int a,int b)
{
    if(a>dr||b<st)
        return -1;
    if(a<=st && dr<=b)//intervalul [st,dr] e continut total in [a,b]
        return arbore[nod];

    int mij=(st+dr)/2;
    int max_st=query(2*nod,st,mij,a,b);
    int max_dr=query(2*nod+1,mij,dr,a,b);
    return maxim(max_st,max_dr);
}

int main(int argc,char **argv)
{
    FILE *f1=fopen("arbint.in","r"),*f2=fopen("arbint.out","w");
    if(!f1||!f2)
    {
        perror(NULL);
        exit(-1);
    }
    int n,m;
    fscanf(f1,"%d %d",&n,&m);
    int val;
    for(int i=1;i<=n;i++)
    {
        fscanf(f1,"%d",&val);
        update(1,1,n,i,val);
    }
    int a,b,tip;
    for(int i=0;i<m;i++)
    {
        fscanf(f1,"%d %d %d",&tip,&a,&b);
        if(tip==0)
        {
            fprintf(f2,"%d\n",query(1,1,n,a,b));
        }
        else
        {
            update(1,1,n,a,b);
        }
    }
    if(fclose(f1)!=0||fclose(f2)!=0)
    {
        perror(NULL);
        exit(-1);
    }
    return 0;
}