Cod sursa(job #1138145)

Utilizator ThomasFMI Suditu Thomas Thomas Data 9 martie 2014 16:41:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
using namespace std;

#define NMax 100001
#define AMax NMax*4

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m;
int A[AMax],v[NMax];

int maxim(int a,int b)
{
    if(a>b) return a;
    else return b;
}

int arbore_int(int nod,int st,int dr)
{
    int mij=(st+dr)/2;
    if(st>dr) return 0;
    if(st==dr) A[nod]=v[st];
    else A[nod]=maxim(arbore_int(2*nod,st,mij),arbore_int(2*nod+1,mij+1,dr));
    return A[nod];
}

int arbore_max(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b) return A[nod];
    else
    {
        int mij=(st+dr)/2,w1=0,w2=0;
        if(mij+1<=dr)
        {
            if(a<=mij) w1=arbore_max(2*nod,st,mij,a,b);
            if(b>mij) w2=arbore_max(2*nod+1,mij+1,dr,a,b);
        }
        return maxim(w1,w2);
    }
}

int arbore_act(int nod,int st,int dr,int a,int b)
{
    if(a==st && a==dr) A[nod]=b;
    else
    {
        int mij=(st+dr)/2,w1=0,w2=0;
        if(mij+1<=dr)
        {
            w1=A[2*nod];w2=A[2*nod+1];
            if(a<=mij) w1=arbore_act(2*nod,st,mij,a,b);
            if(a>mij) w2=arbore_act(2*nod+1,mij+1,dr,a,b);
            A[nod]=maxim(w1,w2);
        }
    }
    return A[nod];
}

int main()
{
    int i,p,a,b;
    f>>n>>m;
    for(i=1;i<=n;i++) f>>v[i];
    arbore_int(1,1,n);

    for(i=1;i<=m;i++)
    {
        f>>p>>a>>b;
        if(p==0) g<<arbore_max(1,1,n,a,b)<<"\n";
        else arbore_act(1,1,n,a,b);
        //for(int j=1;j<=9;j++) g<<A[j]<<" "; g<<"\n";
    }

    f.close();
    g.close();
    return 0;
}