Cod sursa(job #3136450)

Utilizator rose.stoicaStoica Rose-Marie rose.stoica Data 6 iunie 2023 13:04:22
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.33 kb
# include <stdio.h>


# define max 100001



int v[4*max];
int maxi(int a, int b)
{
    if(a>b)
        return a;
    else
        return b;
     
}
void adaugare(int st,int dr,int x,int val,int nod)
{
     if(st == dr)
     {
           v[nod] = val;
           return;
     }
     int mij=(st+dr)/2;
     if(mij>=x)
        adaugare(st,mij,x,val,2*nod);
     else
        adaugare(mij+1,dr,x,val,2*nod+1);
     v[nod]=maxi(v[2*nod],v[2*nod+1]);
}

int minim(int st,int dr,int x,int y,int nod)
{
    if(x <= st && dr <= y)
    {
         return v[nod];
    }
    int mij = (st+dr)/2;
    int val1,val2;
    val1 = val2 = 0;
    if(x <= mij) 
        val1 = minim(st,mij,x,y,2*nod);
    if(y >= mij+1) 
        val2 = minim(mij+1,dr,x,y,2*nod+1);
    return maxi(val1,val2);
}

int main()
{
    int n,m;
    FILE *f1=fopen("arbint.in", "r");
    FILE *f2=fopen("arbint.out", "w");
    
    int x,y;
    int c;
    fscanf(f1,"%d%d",&n,&m);
    
    for(int i = 1;i<=n;i++)
    {
        fscanf(f1,"%d",&x);
        adaugare(1,n,i,x,1);
    }
    
    for(int i=1;i<=m;i++)
    {
        fscanf(f1,"%d%d%d",&c, &x, &y);
        if(c==1)
        {
            adaugare(1,n,x,y,1);
        }
        else
           fprintf(f2,"%d\n",minim(1,n,x,y,1));
        
    }

    
    return 0;
}