Cod sursa(job #2404515)

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

int a[100000],tree[100000],n,m;
int start,end,index,nod,treesize;
int querystart,queryend,val,x;

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

    ///fara overlap
    if (x<start || x>end) return;

    ///a gasit nodul frunza
    if (start==end){
        tree[nod]=val;
        return;
    }

    ///in interval
    int mid=(start+end)/2;
    update(nod*2,start,mid);
    update(nod*2+1,mid+1,end);

    tree[nod]=min(tree[2*nod],tree[2*nod+1]);
    return;
}

///elementul minim dintre subtree in intervalul querystart-queryend
int query(int nod,int start,int end){

    ///fara overlap
    if (querystart>end || queryend<start) return INT_MAX;

    ///overlap complet
    if (start>=querystart && end<=queryend) return tree[nod];

    ///overlap partial
    int mid=(start+end)/2;
    int min_st=query(nod*2,start,mid);
    int min_dr=query(nod*2+1,mid+1,end);

    return min(min_st,min_dr);
}

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

    ///cazul de baza- nodul frunza
    if (start==end){
            tree[nod]=a[start];
            treesize++;
            return;
    }
    ///cazul recursiv
    int mid=(start+end)/2;
    ///subtree stang
    build(2*nod,start,mid);
    ///subtree drept
    build(2*nod+1,mid+1,end);

    int left=tree[nod*2];
    int right=tree[nod*2+1];

    tree[nod]=min(left,right);
    treesize++;
}

int main(){
    ifstream cin ("arbore.in");
    cin>>n>>m;
    for (int i=0;i<n;i++) cin>>a[i];


    //tree[4*n+1] - lungimea
    build(1,0,n-1);
    for (int i=1;i<=treesize;i++) cout<<tree[i]<<" ";cout<<'\n';
    cout<<"marimea pentru arbore: "<<treesize<<'\n'<<'\n';

    while(m--){
        int k; cin>>k;
        if (k==1){
            ///x e pozitia in array care ia valoarea val
            cin>>x>>val;
            update(1,0,n-1);
            cout<<"Arborele schimbat: "<<'\n';
            for (int i=1;i<=treesize;i++) cout<<tree[i]<<" ";cout<<'\n';
        }
        else{
        cin>>querystart>>queryend;
        cout<<"Valoarea minima in intervalul ["<<querystart<<".."<<queryend<<"] este: ";
        cout<<query(1,0,n-1)<<'\n';
        }
    }

return 0;
}