Cod sursa(job #3130313)

Utilizator TirilaPatricTirila Patric-Gabriel TirilaPatric Data 17 mai 2023 15:44:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <vector>
#include <list>
#include <fstream>
using namespace std;
int Min;

int createarbint(int a[], int arbint[], int left, int right, int pos){
    if(left == right) {
        arbint[pos] = a[left];
        return a[left];
    }

    int mid = (left+right)/2;
    int l1 = createarbint(a, arbint, left, mid, pos*2);
    int l2 = createarbint(a, arbint, mid+1, right, pos*2+1);
    arbint[pos] = l1 < l2 ? l2 : l1;
    return arbint[pos];
}

int findMax(int a[], int arbint[], int left, int right, int ileft, int iright, int pos = 0){
    int mid = (left+right)/2;
    if (left >= ileft && right <= iright)
        return arbint[pos];
    if(right < ileft || left > iright) return Min;

    int m1 = findMax(a, arbint, left, mid, ileft, iright, pos*2);
    int m2 = findMax(a, arbint, mid+1, right, ileft, iright, pos*2+1);
    return m1 > m2 ? m1 : m2;
}
void changeVal(int arbint[], int target, int val, int left, int right, int pos){
    if(left == right){
        if(left == target) {
            arbint[pos] = val;
        }
        return;
    }
    int mid = (left+right)/2, newPos = pos*2;
    if(target<=mid) changeVal(arbint, target, val, left, mid, newPos);
    else changeVal(arbint, target, val, mid+1, right, newPos+1);
    arbint[pos] = arbint[newPos] > arbint[newPos+1] ? arbint[newPos] : arbint[newPos+1];
}

int main(){
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int n, m;
    f>>n>>m;
    int a[n+1], i=1;
    while(i<n+1){
        f>>a[i++];
        if(Min > a[i-1]) Min = a[i-1];
    }
    a[0] = Min;
    int l = 1;
    while(l<n){
        l*=2;
    }
    l = l*2;
    int arbint[l];
    for(int i=0; i<l; i++){
        arbint[i] = Min;
    }

    createarbint(a, arbint, 1, n, 1);

    int b, c, d;
    while(m>0){
        f>>b>>c>>d;
        switch(b){
            case 0: {
                g<<findMax(a, arbint, 1, n, c, d, 1)<<endl;
                break;
            }
            case 1: {
                changeVal(arbint, c, d, 1, n, 1);
                break;
            }
            default: {
                break;
            }
        }
        m--;
    }





    f.close();
    g.close();

    return 0;
}