Cod sursa(job #854948)

Utilizator RamaStanciu Mara Rama Data 14 ianuarie 2013 13:26:41
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>

int n,m,mx,A[400000],val,poz,a,b;

int maxim(int a,int b)
{
       if(a>b) return a;
          else return b;
}
void actualizare(int nod,int st,int dr)
{
     if(st==dr)
     {
               A[nod]=val;
               return;
     }
     int mid=(st+dr)/2;
     if(poz<=mid) actualizare (nod*2,st,mid);
          else actualizare(nod*2+1,mid+1,dr);
     A[nod]=maxim(A[nod*2],A[nod*2+1]);
}

void interogare(int nod,int st,int dr)
{
    if(a<=st && dr<=b)
    {
             mx=maxim(A[nod],mx);
             return;
    }
    int mid=(st+dr)/2;
    if(a<=mid)
    interogare(nod*2,st,mid);
    if(b>mid)
    interogare(nod*2+1,mid+1,dr);
}

int main()
{
    FILE*f,*g;
    f=fopen("arbori.in","r");
    g=fopen("arbori.out","w");
    int i,op,x;
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
            fscanf(f,"%d",&x);
            poz=i;val=x;
            actualizare(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
            fscanf(f,"%d%d%d",&op,&a,&b);
            switch(op)
                {
                    case 0 : {mx=-1;interogare(1,1,n); fprintf(g,"%d\n",mx); break;}
                    case 1 : {val=b; poz=a;actualizare(1,1,n);break;}
                }
    }
    return 0;
}