Cod sursa(job #3232552)

Utilizator INDRIE_FILIPIndrie Filip-Iulian INDRIE_FILIP Data 30 mai 2024 20:08:54
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <stdio.h>
#include <stdlib.h>

#define dim 100000

typedef struct nod{
    int val;
    struct nod *st,*dr;
}nod_t;

void print_tree(nod_t *tree){
    if(tree){
        print_tree(tree->st);
        print_tree(tree->dr);
        printf("%d ",tree->val);
    }
}

int maxim(int a,int b){
    return (a<b)?b:a;
}

nod_t* update_tree(nod_t *tree,int st,int dr,int pos,int val){
    if(tree==NULL){
        tree=malloc(sizeof(nod_t));
        tree->val=0;
        tree->st=NULL;
        tree->dr=NULL;
    }
    if(st==dr){
        tree->val=val;
        return tree;
    }
    int m=(st+dr)/2;
    if(pos<=m){
        tree->st=update_tree(tree->st,st,m,pos,val);
    }
    else{
        tree->dr=update_tree(tree->dr,m+1,dr,pos,val);
    }
    if(tree->st && tree->dr){
        tree->val=maxim(tree->st->val,tree->dr->val);
    }
    else if(tree->st){
        tree->val=tree->st->val;
    }
    else if(tree->dr){
        tree->val=tree->dr->val;
    }
    return tree;
}

void search(nod_t *tree,int st,int dr,int a,int b,int *_maxim){
    if(a<=st && dr<=b){
        *_maxim=maxim(*_maxim,tree->val);
        return;
    }
    int m=(st+dr)/2;
    if(a<=m && tree->st){
        search(tree->st,st,m,a,b,_maxim);
    }
    if(m<b && tree->dr){
        search(tree->dr,m+1,dr,a,b,_maxim);
    }
}

int main()
{
    FILE *f,*g;
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    nod_t *tree=NULL;
    int n,m;
    fscanf(f,"%d",&n);
    fscanf(f,"%d",&m);
    for(int i=0;i<n;++i){
        int a;
        fscanf(f,"%d",&a);
        tree=update_tree(tree,0,n-1,i,a);
    }
    for(int i=0;i<m;++i){
        int x,a,b;
        fscanf(f,"%d%d%d",&x,&a,&b);
        if(x==0){
            int _maxim=-1;
            search(tree,0,n-1,a-1,b-1,&_maxim);
            fprintf(g,"%d\n",_maxim);
        }
        else{
            update_tree(tree,0,n-1,a-1,b);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}