Cod sursa(job #1877845)

Utilizator marcdariaDaria Marc marcdaria Data 13 februarie 2017 19:09:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda becreative11 Marime 1.44 kb
#include <fstream>
#define lg 100005

using namespace std;
int n,m,init[lg],t[4*lg+200],a,b,rez;
inline int max(int aa,int bb){
    return aa>bb?aa:bb;
}

// vectorul init
void construiesc(int st,int dr,int poz){
    if(st==dr){
        init[st]=poz;

        return;
    }
    int x=(st+dr)/2;
    construiesc(st,x,2*poz);
    construiesc(x+1,dr,2*poz+1);
}

//***************ACTUALIZARE
void actualizez(int poz, int val){
    int x=init[poz];
    t[x]=val;
    x>>=1;
    while(x){
        t[x]=max(t[2*x],t[2*x+1]);
        x>>=1;
    }
}

//************INTEROGARE
void interogare(int st,int dr,int poz){
    if(st>b || dr<a)
        return;
    if(a<=st && dr<=b)
        rez=max(rez,t[poz]);
    else{
        if(st<dr){
            int x=(st+dr)/2;
            interogare(st,x,poz*2);
            interogare(x+1,dr,poz*2+1);
        }
    }
}

int main(){
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int i,x;

    fin>>n>>m;
    construiesc(1,n,1);
    fout<<'\n';



   //*************CITIRE ELEMENTE
    for(i=1;i<=n;++i){
        fin>>x;
        actualizez(i,x);
    }

//****************EFECTUARE TESTE
    for(i=0;i<m;++i){
        fin>>x>>a>>b;
        if(!x){
            rez=0;
            interogare(1,n,1);
            fout<<rez;
        }
        else
            actualizez(a,b);
    }
    fout<<'\n';
    fin.close();
    fout.close();


    return 0;
}