Cod sursa(job #1020597)

Utilizator RobertSSamoilescu Robert RobertS Data 2 noiembrie 2013 12:29:33
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;


struct nod {
    int bg, end;
    int maxim;
};


nod arb[100000];
int size = 0;
int n, m, v[100000];


void build(int a, int b, int index){
    size ++;
    arb[index].bg = a;
    arb[index].end = b;

    if(a < b){
        int mij = (a+b)/2;
        build(a, mij, 2*index);
        build(mij+1, b, 2*index + 1);
    }

    if(a == b)
    arb[index].maxim = v[a];
}


void setMaxim(){
    int poz = size;

    while(poz > 0){
        int  val_max = max(arb[poz].maxim, arb[poz-1].maxim);
        arb[(poz-1)/2].maxim = val_max;
        poz -=2;
    }

}

int max_val;

void max_interval(int index, int st, int fs, int a, int b){

    if(a <= st && b >= fs){
        if(arb[index].maxim > max_val){
            max_val = arb[index].maxim;
        }
    }else if(a <=b){
        int mij = (st + fs)/2;

        if(mij > b){
            max_interval(2*index, st, mij, a, b);
        }else if(mij < a){
            max_interval(2*index+1, mij+1,fs,a,b);
        }else{
            max_interval(2*index,st,mij,a,mij);
            max_interval(2*index+1,mij+1, fs, mij+1,b);
        }

    }

}


int main()
{

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

    fin >> n >> m;
    for(int i=1; i<=n; i++){
        fin >> v[i];
    }

    build(1,n,1);
    setMaxim();

    int cmd, a, b;
    for(int i=1; i<=m; i++){
        fin >> cmd >>  a >> b;
        if(cmd == 0){
            max_val = v[a];
            max_interval(1,1,n,a,b);
            fout << max_val << '\n';
        }else{
            v[a] = b;
            for(int j=1; j<=size; j++)
                if(arb[j].bg == arb[j].end && arb[j].bg == a){
                    arb[j].maxim = b; break;
                }
            setMaxim();
        }
    }


    return 0;
}