Cod sursa(job #2703046)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 6 februarie 2021 20:41:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <climits>
#define dim 100010
using namespace std;
int A[4*dim];
int n,a,b,q,t,sol;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

void build(int nod, int st, int dr) {
    if (st==dr) {
        fin>>A[nod];
    }
    else {
        int mid=(st+dr)/2;
        build (nod*2,st,mid);
        build (nod*2+1,mid+1,dr);
        A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}

int query (int nod, int st, int dr, int a, int b) {///returneaza minimul dintre a si b
    if (a<=st&&dr<=b) {
        sol=max(sol,A[nod]);
    }
    else {
        int mid=(st+dr)/2;
        if (a<=mid) {
            query(2*nod,st,mid,a,b);
        }
        if (b>mid) {
            query(2*nod+1,mid+1,dr,a,b);
        }
    }
}

int update (int nod, int st, int dr, int poz, int val) {
    if (st==dr) {
        A[nod]=val;
    }
    else {
        int mid=(st+dr)/2;
        if (poz<=mid) {
            update(2*nod,st,mid,poz,val);
        }
        else {
            update(2*nod+1,mid+1,dr,poz,val);
        }
        A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}

int main() {
    fin>>n>>q;
    build(1,1,n);
    for (;q--;) {
        fin>>t>>a>>b;
        if (t==0) {///operatie de query
            sol=INT_MIN;
            query(1,1,n,a,b);
            fout<<sol<<"\n";
        }
        else {///operatie de update
            update(1,1,n,a,b);
        }
    }
    return 0;
}