Cod sursa(job #3227829)

Utilizator andreea678Rusu Andreea andreea678 Data 2 mai 2024 21:07:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[500000];
int x, a, b, n, m;
int maxim;
int tip;
void update(int poz, int val, int nod, int left, int right){
    if (left==right){ ///am gasit nodul corespunzator elementului
        arb[nod]=val; ///schimb valoarea elementului
        return;
    }
    int mij=(left+right)/2;
    if (poz<=mij){
        update(poz,val,2*nod,left,mij); ///ma duc la fiul stanga
    }
    else{
        update(poz,val,2*nod+1,mij+1,right); ///ma duc la fiul dreapta
    }
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void query(int qleft, int qright, int nod, int left, int right){
    if (qleft<=left && qright>=right){ ///acopar tot intervalul
        maxim=max(maxim,arb[nod]);
        return;
    }
    int mij=(left+right)/2;
    if (qleft<=mij){
        query(qleft,qright,nod*2,left,mij); ///ma duc la fiul stanga
    }
    if (mij<qright){
        query(qleft,qright,nod*2+1,mij+1,right); ///ma duc la fiul dreapta
    }
}
int main()
{

    fin >> n >> m;
    for (int i=1; i<=n; ++i){
        fin >> x;
        update(i,x,1,1,n);
    }
    for (int i=1; i<=m; ++i){
        fin >> tip >> a >> b;
        if (tip==0){
            maxim=-1;
            query(a,b,1,1,n);
            fout << maxim << '\n';
        }
        else if (tip==1){
            update(a,b,1,1,n);
        }
    }
    return 0;
}