Cod sursa(job #854936)

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

using namespace std;
int A[400000],val,poz,st,dr,n,m,mx,a,b;
int maxim(int a,int b)
{
    if (a>b) return a;
        else return b;
}
void actualizare(int nod,int st,int dr)
{
    int mid;
    if(st==dr)
    {
        A[nod]=val;
        return;
    }
    mid=(st+dr)/2;
    if(poz<=mid) actualizare(2*nod,st,mid);
        else actualizare(2*nod+1,mid+1,dr);
    A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
void interogare(int nod,int st,int dr)
{
    int mid;
    if((a<=st) && (b>=dr))
    {
        if(mx<A[nod]) mx=A[nod];
        return;
    }
    mid=(st+dr)/2;
    if(a<=mid) interogare(2*nod,st,mid);
    if(mid<b) interogare(2*nod+1,mid+1,dr);
}
int main()
{
    int i,x,op;
    FILE*f,*g;
    f=fopen("arbori.in","r");
    g=fopen("arbori.out","w");
    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;
}