Cod sursa(job #3232556)

Utilizator Seress26Seres Artur Seress26 Data 30 mai 2024 22:19:00
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.88 kb
#include <stdio.h>
#include <stdlib.h>

int putere_doi_ko(int n)
{   
    n=n|(n>>1);
    n=n|(n>>2);
    n=n|(n>>4);
    n=n|(n>>8);
    n=n|(n>>16);
    return n+1;
}
int putere_doi_ok(int n)
{
    if((n&(n-1))==0)
        return 1;
    else
        return 0;
}
int max(int a,int b)
{
    if(a>=b)
        return a;
    else
        return b;
}
void build_tree(int *tree,int *v,int nod,int stanga,int dreapta)
{   
    int mid=0;
    if(stanga==dreapta)
    {
        tree[nod]=v[stanga]; 
        return;
    }
    mid=(stanga+dreapta)/2;
    build_tree(tree,v,2*nod+1,stanga,mid);
    build_tree(tree,v,2*nod+2,mid+1,dreapta);
    tree[nod]=max(tree[2*nod+1],tree[2*nod+2]);
}
void modifica_tree(int *tree,int *v,int nod,int stanga,int dreapta,int a,int b)
{
    int mid=0;
    if(stanga==dreapta)
    {
        tree[nod]=b;
        return;
    }
    mid=(stanga+dreapta)/2;
    if(a<=mid)
    {   
        modifica_tree(tree,v,2*nod+1,stanga,mid,a,b);
    }
    else
    {   
        modifica_tree(tree,v,2*nod+2,mid+1,dreapta,a,b);
    }
    tree[nod]=max(tree[2*nod+1],tree[2*nod+2]);
}
void rezolvare(int *tree,int *v,int nod,int stanga,int dreapta,int a,int b,int *maxi)
{   
    int mid=0;
    if(stanga>b||dreapta<a)
        return;
    if(stanga>=a&&dreapta<=b)
    {
        *maxi=max(*maxi,tree[nod]);
        return;
    }
    mid=(stanga+dreapta)/2;
    rezolvare(tree,v,2*nod+1,stanga,mid,a,b,maxi);
    rezolvare(tree,v,2*nod+2,mid+1,dreapta,a,b,maxi);
}
void citire(FILE *fis,FILE *gis)
{
    int n=0,m=0,i=0,x=0,a=0,b=0,dimensiune=0,maxi=0;
    int *v=NULL,*tree=NULL;
    fscanf(fis,"%d",&n);
    fscanf(fis,"%d",&m);
    v=(int*)malloc(n*sizeof(int));
    if(v==NULL)
    {
        perror("eroare la alocarea dinamica\n");
        exit(-1);
    }
    for(i=0;i<n;i++)
    {
        fscanf(fis,"%d",&v[i]);
    }
    if(putere_doi_ok(n)==1)
    {
        dimensiune=n*2-1;
    }
    else
    {
        dimensiune=putere_doi_ko(n)*2-1;
    }
    tree=(int*)malloc(dimensiune*sizeof(int));
    if(tree==NULL)
    {
        perror("eroare la alocarea dinamica\n");
        exit(-1);
    }
    build_tree(tree,v,0,0,n-1);
    while(m!=0)
    {   
        fscanf(fis,"%d",&x);
        fscanf(fis,"%d",&a);
        fscanf(fis,"%d",&b);
        if(x==0)
        {
            maxi=0;
            rezolvare(tree,v,0,0,n-1,a-1,b-1,&maxi);
            fprintf(gis,"%d\n",maxi);
        }
        if(x==1)
        {   
            modifica_tree(tree,v,0,0,n-1,a-1,b);
        }
        m--;
    }
    free(tree);
    free(v);
}
int main(void)
{
    FILE *fis=NULL,*gis=NULL;
    fis=fopen("arbint.in","r");
    if(fis==NULL)
    {
        perror("eroare la deschiderea fiserului de intrare\n");
        exit(-1);
    }
    gis=fopen("arbint.out","w");
    if(gis==NULL)
    {
        perror("eroare la deschiderea fisierului de iesire\n");
        exit(-1);
    }
    citire(fis,gis);
    fclose(fis);
    fclose(gis);

    return 0;
}