Cod sursa(job #3300908)

Utilizator razvan.14Andronie Razvan razvan.14 Data 20 iunie 2025 00:36:52
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100009

int v[NMAX], tree[4*NMAX+3];

int max(int x, int y)
{
    if(x>y)
    return x;
    else return y;
}

void build_tree(int node,int left,int right)
{
    if(left==right)
    {
        tree[node]=v[left];
        return; 
    }
    int middle=(left+right)/2;
    build_tree(2*node,left,middle);
    build_tree(2*node+1,middle+1,right);
    tree[node]=max(tree[2*node],tree[2*node+1]);
}

void update(int node,int left,int right,int idx,int value)
{
    if(left==right)
    {
        tree[node]=value;
        return;
    }
    int middle=(left+right)/2;
    if(idx<=middle)
        update(2*node,left,middle,idx,value);
    else
        update(2*node+1,middle+1,right,idx,value);
    tree[node]=max(tree[2*node],tree[2*node+1]);
}

int query(int node,int left,int right,int x,int y)
{
    if(x<=left && right<=y)
    {
        return tree[node];
    }
    if(y<left || x>right)
    {
        return 0;
    }
    int middle=(left+right)/2;
    int l=query(2*node,left,middle,x,y);
    int r=query(2*node+1,middle+1,right,x,y);
    return max(l,r);
}

int main(void)
{
    FILE *fin=fopen("arbint.in","r"), *fout=fopen("arbint.out","w");
    if(fin==NULL)
    {
        fprintf(stderr,"error when opening file");
        exit(-1);
    }
    if(fout==NULL)
    {
        fprintf(stderr,"error when opening file");
        exit(-1);
    }
    int N,M;
    fscanf(fin,"%d %d",&N,&M);
    for (int i = 1; i <= N; i++) 
    {
        fscanf(fin, "%d", &v[i]);
    }
    build_tree(1,1,N);
    for(int i=0;i<M;i++)
    {   
        int type,x,y;
        fscanf(fin,"%d %d %d",&type,&x,&y);
        if(type==0)
        {
            int rez=query(1,1,N,x,y);
            fprintf(fout,"%d\n",rez);
        }
        else
        {
            update(1,1,N,x,y);
        }
    }
    if(fclose(fin)!=0)
    {
        fprintf(stderr,"error when closing file");
        exit(-1);
    }
    if(fclose(fout)!=0)
    {
        fprintf(stderr,"error when closing file");
        exit(-1);
    }

    return 0;
}