Cod sursa(job #2116685)

Utilizator sebistetuCucolas Sebastian sebistetu Data 27 ianuarie 2018 20:48:03
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>

using namespace std;

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

const int Nmax = 100005;

int v[Nmax], t[2 * Nmax], n, M, operatie;

int tip0(int nod, int st, int dr, int x, int y){

    if(st >= x and y >= dr)
        return t[nod];
    else{

        int r1 = 0, r2 = 0, m;

        m = (st + dr) / 2;

        if(x <= m)
            r1 = tip0(2 * nod, st, m, x, y);

        if(y > m)
            r2 = tip0(2 * nod + 1, m + 1, dr, x, y);

        return max(r1,r2);
    }
}


void tip1(int nod, int st, int dr, int poz, int val){

    if(st == dr)
       t[nod] = val;
    else{

        int m = (st + dr) / 2;
        if(poz <= m)
            tip1(2*nod, st, m, poz, val);
        else
            tip1(2*nod+1, m+1, dr, poz, val);

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

void creare_arbore(int nod, int st, int dr){

    if(st == dr)
        t[nod] = v[st];
    else{

        int m = (st + dr) / 2;

        creare_arbore(2*nod, st, m);
        creare_arbore(2*nod+1, m+1, dr);

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

}

void solve(){

    f >> n >> M;

    int i;
    for(i = 1; i <= n; i++)
        f >> v[i];

    creare_arbore(1, 1, n);

    for(i = 1; i <= M; i++){

        f >> operatie;

        if(operatie == 0){

            int l, r;
            f >> l >> r;

            g << tip0(1, 1, n, l, r) << '\n';
        }
        else{

            int poz, val;
            f >> poz >> val;

            tip1(1, 1, n, poz, val);
        }
    }
}
int main(){

    solve();

    return 0;
}