Cod sursa(job #3295286)

Utilizator fabiplavatPlavat Fabian-Remus fabiplavat Data 3 mai 2025 23:39:19
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.58 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int value;
    int position;
    int indexleft,indexright;
    struct node* st,* dr;
}node;

node* create_node(int left,int right)
{
    node* newnode=(node*)malloc(sizeof(node));
    newnode->value=1;
    newnode->indexleft=left;
    newnode->indexright=right;
    newnode->st=NULL;
    newnode->dr=NULL;
    return newnode;

}

int max(int a, int b) {
    return (a > b) ? a : b;
}

void addnode(node **tree,int pos,int value,int leftint,int rightint)
{
    if(*tree==NULL)
    {
        *tree=create_node(leftint,rightint);

    }

    if(leftint == rightint)
        {
            (*tree)->value=value;
            return;
        }
    int mid=(leftint+rightint)/2;
    if(pos<=mid)
    {
        addnode(&(*tree)->st,pos,value,leftint,mid);
    }
    else
    {
        addnode(&(*tree)->dr,pos,value,mid+1,rightint);
    }

    int leftVal=(*tree)->st ?(*tree)->st->value:-1;
    int rightVal=(*tree)->dr ? (*tree)->dr->value: -1;

    if (leftVal>= rightVal) {
        (*tree)->value = leftVal;
    } else {
        (*tree)->value =rightVal;
    }
    
}

int displaynode(int left,int right,node *tree)
{
    if(tree==NULL||right<tree->indexleft||left>tree->indexright)
        return -1;
    if(tree->indexleft>=left&&tree->indexright<=right)
        return tree->value;

    int leftMax = displaynode( left, right,tree->st);
    int rightMax = displaynode(left, right,tree->dr );
    return max(leftMax, rightMax);
}

void changenode(int position,int value,node *tree)
{
    if(tree==NULL|| position< tree->indexleft || position > tree->indexright)
        return;
    if(tree->indexleft == tree->indexright)
        {
            tree->value=value;
            return;
        }

    changenode(position,value,tree->st);
    changenode(position,value,tree->dr);

    int leftVal = tree->st ? tree->st->value : -1;
    int rightVal = tree->dr ? tree->dr->value : -1;

    if (leftVal >= rightVal) {
        tree->value = leftVal;
    } else {
        tree->value = rightVal;
    }

}

int main()
{
    int n,m;
    FILE* in=fopen("arbint.in","r");
    FILE* out=fopen("arbint.out","w");

    fscanf(in,"%d %d",&n,&m);
    node *tree=NULL;
    for(int i=1;i<=n;i++)
    {
        int value;
        fscanf(in,"%d",&value);
        addnode(&tree,i,value,1,n);
    }
    for(int i=1;i<=m;i++)
    {
        int opt, left,right;
        fscanf(in,"%d %d %d",&opt,&left,&right);
        if(opt==0)
        {
            fprintf(out,"%d\n",displaynode(left,right,tree));
        }
        if(opt==1)
        {
            changenode(left,right,tree);
        }
    }
}