Cod sursa(job #779118)

Utilizator stefanzzzStefan Popa stefanzzz Data 16 august 2012 17:56:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

long n,m,v[NMAX],ai[4*NMAX],x,y,mx;
bool opt;

void construieste_ai(long nod,long st,long dr);
void modifica(long nod,long st,long dr);
void calculeaza(long nod,long st,long dr);
long MAX(long a,long b){
    return a>b?a:b;}

int main()
{
    long i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    construieste_ai(1,1,n);
    for(i=1;i<=m;i++){
        f>>opt>>x>>y;
        if(opt)
            modifica(1,1,n);
        else{
            mx=0;
            calculeaza(1,1,n);
            g<<mx<<'\n';}}
    f.close();
    g.close();
    return 0;
}

void construieste_ai(long nod,long st,long dr){
    if(st==dr)
        ai[nod]=v[st];
    else{
        long mij=(st+dr)/2;
        construieste_ai(2*nod,st,mij);
        construieste_ai(2*nod+1,mij+1,dr);
        ai[nod]=MAX(ai[2*nod],ai[2*nod+1]);}}

void modifica(long nod,long st,long dr){
    if(st==dr)
        ai[nod]=y;
    else{
        long mij=(st+dr)/2;
        if(x<=mij)
            modifica(2*nod,st,mij);
        else
            modifica(2*nod+1,mij+1,dr);
        ai[nod]=MAX(ai[2*nod],ai[2*nod+1]);}}

void calculeaza(long nod,long st,long dr){
    if(st>=x&&dr<=y){
        if(ai[nod]>mx)
            mx=ai[nod];}
    else{
        long mij=(st+dr)/2;
        if(x<=mij)
            calculeaza(2*nod,st,mij);
        if(y>mij)
            calculeaza(2*nod+1,mij+1,dr);}}