Cod sursa(job #3130283)

Utilizator TirilaPatricTirila Patric-Gabriel TirilaPatric Data 17 mai 2023 15:02:19
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <iostream>
#include <vector>
#include <list>
#include <fstream>
using namespace std;
vector<int> arbint;
int Min;
int createarbint(int a[], vector<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+1);
    int l2 = createarbint(a, arbint, mid+1, right, pos*2+2);
    arbint[pos] = l1 < l2 ? l2 : l1;
    return arbint[pos];
}
int findMax(int a[], vector<int> arbint, int left, int right, int ileft, int iright, int pos = 0){
//    if(left == right) return arbint[left];
    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+1);
    int m2 = findMax(a, arbint, mid+1, right, ileft, iright, pos*2+2);
    return m1 > m2 ? m1 : m2;
}
void changeVal(vector<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;
    if(target<=mid) changeVal(arbint, target, val, left, mid, pos*2+1);
    else changeVal(arbint, target, val, mid+1, right, pos*2+2);
    arbint[pos] = arbint[pos*2+1] > arbint[pos*2+2] ? arbint[pos*2+1] : arbint[pos*2+2];
}

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

    createarbint(a, arbint, 0, n2-1, 0);

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





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

    return 0;
}