Cod sursa(job #1364286)

Utilizator blue_skyPetrica Stefan Cosmin blue_sky Data 27 februarie 2015 16:32:38
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define DIM 100002

using namespace std;

int n,m,x,arb[2*DIM],a,b;
bool t;

void Update(int k,int poz,int x,int st,int dr){
    //nodul k-intervalul [st,dr]
    //inlocuiesc valoarea de pe pozitia poz cu valoarea x
    int mid=(st+dr)/2;

    if(st==dr) arb[k]=x;

    else{
        if(poz<=mid) Update(k*2,poz,x,st,mid);
        else Update(k*2+1,poz,x,mid+1,dr);

        arb[k]=max(arb[k*2],arb[k*2+1]);
    }
}

int Queri(int k,int a,int b,int st,int dr){
    if(a<=st && b>=dr) return arb[k];
    else{
        int mid=(st+dr)/2;
        if(b<=mid) return Queri(k*2,a,b,st,mid);
        else if(a>mid) return Queri(k*2+1,a,b,mid+1,dr);
        else return max(Queri(k*2,a,mid,st,mid),Queri(k*2+1,mid+1,b,mid+1,dr));
    }
}

int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    for(int i=1;i<=n;++i){
        f>>x;
        Update(1,i,x,1,n);
    }

    for(int i=1;i<=m;++i){
        f>>t>>a>>b;
        if(t) Update(1,a,b,1,n);
        else g<<Queri(1,a,b,1,n)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}