Cod sursa(job #2404511)

Utilizator S_DanSochirca Dan S_Dan Data 12 aprilie 2019 22:16:38
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;

int a[100000],h[100000],n,m;
int st,dr,nod,treesize=0;
int x,y;

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

	//fară overlap
    if (x<st || x>dr) return;

    //a găsit nodul frunză
    if (st==dr){
        h[nod]=y;
        return;
    }

    //se află in interval- x e între st și dr
    int mid=(st+dr)/2;
    update(nod*2,st,mid);
    update(nod*2+1,mid+1,dr);

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

///elementul minim din intervalul [x..y]
int query(int nod,int st,int dr){

    //fară overlap->iese din interval
    if (x>dr || y<st) return INT_MIN;

    //overlap complet->a găsit intervalul în arbore
    if (st>=x && dr<=y) return h[nod];

    //overlap parțial
    int mid=(st+dr)/2;
    int max_st=query(nod*2,st,mid);
    int max_dr=query(nod*2+1,mid+1,dr);

    return max(max_st,max_dr);
}

void build(int nod, int start, int end){

    ///cazul de bază- nodul frunză
    if (start==end){
            h[nod]=a[start];
            return;
    }

    ///CAZUL RECURSIV:
    int mid=(start+end)/2;
    build(2*nod,start,mid);   //<-subarbore stâng
    build(2*nod+1,mid+1,end); //<-subarbore drept

    //întoarcerea de la recursie:
    int left=h[nod*2];
    int right=h[nod*2+1];

    h[nod]=max(left,right); //informația din nod
}

int main(){
    ifstream cin ("arbint.in");
    ofstream cout ("arbint.out");
    cin>>n>>m;

    for (int i=1;i<=n;i++) cin>>a[i];

    build(1,1,n);

    while(m--){
        int k; cin>>k;
        if (k==1){
            cin>>x>>y;
            update(1,1,n);
        }
        else{
        	cin>>x>>y;
        	//cout<<"Valoarea minima in intervalul ["<<x<<".."<<y<<"] este: ";
        	cout<<query(1,1,n)<<'\n';
        }
    }

return 0;
}