Cod sursa(job #1910844)

Utilizator rares00Foica Rares rares00 Data 7 martie 2017 18:34:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#define LIM 2100001
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

int n,m;
int ArbMax[LIM]; //arborele de intervale - maxim
int Val; //valoarea adaugata
int PozI; //pozitia din vectorul initial
int inc,sf; //inceputul si sfarsitul intervalului de interes
int mx; //maximul din intervalul cautat

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

void actualizare(int nod,int st,int dr)
{
    if(st==dr)
        ArbMax[nod]=Val;
    else{
        int mij=st+(dr-st)/2;

        if(PozI<=mij) actualizare(2*nod, st, mij);
        else    actualizare(2*nod+1, mij+1, dr);

        ArbMax[nod]=max(ArbMax[2*nod],ArbMax[2*nod+1]);
    }
}

void interogare(int nod,int st,int dr)
{
//3 cazuri in functie de suprapunerea [inc;sf] cu [st;dr]
    //: suprapunere totala, suprapunere partiala, fara suprapunere
    if(inc<=st && dr<=sf) //daca [st;dr] e inclus in [inc;sf]
    {
        if(mx<ArbMax[nod])
            mx=ArbMax[nod];
        return ;
    }
    else{
        int mij=st+(dr-st)/2;

        if(inc<=mij) interogare(2*nod, st, mij);
        if(mij+1<=sf) interogare(2*nod+1, mij+1, dr);
    }
}

void citire()
{
    int x;
    in>>n>>m;
    for(int i=1;i<=n;++i)
    {
        in>>x;
        Val=x, PozI=i;
        actualizare(1,1,n);
    }
}

int main()
{
    citire();
    //for(int i=1;i<=9;++i)
      //  out<<ArbMax[i]<<" ";

    int x,A,B;
    for(int i=1;i<=m;++i)
    {
        in>>x>>A>>B;
        if(x==0)
        {
            //determina maximul din intervalul [A;B]
            mx=-1, inc=A, sf=B;
            interogare(1,1,n);
            out<<mx<<"\n";
        }
        else if(x==1)
        {
            //schimba elementul de pe pozitia A din vectorul initial cu B
            PozI=A, Val=B;
            actualizare(1,1,n);
        }
    }
    return 0;
}