Cod sursa(job #1213566)

Utilizator ionicaion ionica Data 28 iulie 2014 15:34:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
//#include <fstream>
#include<stdio.h>
#include<algorithm>
using namespace std;
//ifstream f("arbint.in");
FILE *f=fopen("arbint.in","r");
//ofstream g("arbint.out");
FILE *g=fopen("arbint.out","w");

int x[100001],A[200001],n,m;
void creare_arb(int nod,int st_arb,int dr_arb)
{
    int mij;
    if(st_arb==dr_arb)
        A[nod]=x[st_arb];
    else
    {
        mij=(st_arb+dr_arb)/2;
        creare_arb(2*nod,st_arb,mij);
        creare_arb(2*nod+1,mij+1,dr_arb);
        A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}
void actualizare_arb(int nod,int st_arb,int dr_arb,int poz,int val)
{
    int mij;
    if(st_arb==dr_arb)
        A[nod]=val;
    else
    {
    mij=(st_arb+dr_arb)/2;
    if(poz<=mij)
        actualizare_arb(2*nod,st_arb,mij,poz,val);
    else actualizare_arb(2*nod+1,mij+1,dr_arb,poz,val);
    A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}

int interogare_arb(int nod,int st_arb,int dr_arb,int st_x,int dr_x)
{
    int mij,rez,rez1,rez2;
    if(st_x<=st_arb && dr_arb<=dr_x)
        return A[nod];
        else
        {
        mij=(st_arb+dr_arb)/2;
        rez=-1;
        if(st_x<=mij &&st_arb<=dr_x)
           {
               rez1=interogare_arb(2*nod,st_arb,mij,st_x,dr_x);
               rez=max(rez,rez1);
           }

        if(st_x<=dr_arb && mij+1<=dr_x)
            {
            rez2=interogare_arb(2*nod+1,mij+1,dr_arb,st_x,dr_x);
            rez=max(rez,rez2);
            }
        return rez;
        }

}

int main()
{
    int tip,a,b,i;
    //f>>n>>m;
    fscanf(f,"%d %d",&n, &m);
    for(i=1;i<=n;i++)
       // f>>x[i];
       fscanf(f,"%d",&x[i]);
    creare_arb(1,1,n);
    for(i=1;i<=m;i++)
    {

        //f>>tip>>a>>b;
        fscanf(f,"%d %d %d",&tip,&a,&b);
        if(tip==1)
            actualizare_arb(1,1,n,a,b);
        else //g<<interogare_arb(1,1,n,a,b)<<endl;
             fprintf(g,"%d\n",interogare_arb(1,1,n,a,b));

    }
    return 0;
}