Cod sursa(job #1938052)

Utilizator Alex18maiAlex Enache Alex18mai Data 24 martie 2017 16:23:00
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int A[100010];

void Update (int nod, int st, int dr, int pos, int val){
    if (st==dr){
        A[nod]=val;
        return;
    }
    int mij = (st+dr) >> 1;
    if (pos<= mij){
        Update(nod << 1, st, mij, pos, val);
    }
    else{
        Update((nod << 1)+1, mij+1, dr, pos, val);
    }
    A[nod]= max (A[nod << 1], A[(nod<<1)+1]);
}

void Query (int nod, int st, int dr, int a, int b,int &MAX)
{
    if(st>=a && dr<=b)
    {
        MAX = max(MAX, A[nod]);
        return;
    }
    int mij=(st+dr)/2;
    if (mij<b){
        Query(2*nod+1,mij+1,dr,a,b,MAX);
    }
    if (mij>=a){
        Query(2*nod,st,mij,a,b,MAX);
    }
}

int main()
{
    int n,m;
    cin>>n>>m;
    for (int i=1; i<=n; i++){
        int val;
        cin>>val;
        Update (1,1,n,i,val);
    }
    for (int i=1; i<=m; i++){
        int x, a, b;
        cin>>x>>a>>b;
        if (x==0){
            int MAX=0;
            Query(1,1,n,a,b,MAX);
            cout<<MAX<<'\n';
        }
        else{
            Update(1,1,n,a,b);
        }
    }
    return 0;
}