Cod sursa(job #3134030)

Utilizator RadushCordunianu Radu Radush Data 27 mai 2023 22:00:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
class AInt {
private:
    vector<int> tree;
    int n;
    void init(const vector<int>& arr,int st,int dr,int pos) {
        if (st == dr) {
            tree[pos]=arr[st];
            return;
        }
        int mid=st+(dr-st)/2;
        init(arr,st,mid,2*pos+1);
        init(arr,mid+1,dr,2*(pos+1));
        tree[pos]=max(tree[2*pos+1],tree[2*(pos+1)]);
    }
    int getMax_(int ql,int qr,int st,int dr,int pos) {
        if (ql<=st && qr>=dr)
            return tree[pos];

        if (ql>dr || qr<st)
            return INT_MIN;

        int mid=st+(dr-st) / 2;
        return max(getMax_(ql,qr,st,mid,2*pos+1),getMax_(ql,qr,mid+1,dr,2*(pos+1)));
    }


    void schimba_(int x,int val,int st,int dr,int pos) {
        if (x<st || x>dr)
            return;
        if (st == dr) {
            tree[pos]=val;
            return;
        }
        int mid=st+(dr-st) / 2;
        schimba_(x,val,st,mid,2*pos+1);
        schimba_(x,val,mid+1,dr,2*pos+2);
        tree[pos]=max(tree[2*pos+1],tree[2*(pos+1)]);
    }
public:
    AInt(const vector<int>& arr) {
        n=arr.size();
        tree.resize(4*n);
        init(arr,0,n-1,0);
    }
    void schimba(int x,int val) {
        schimba_(x,val,0,n-1,0);
    }
    int getMax(int ql,int qr) {
        return getMax_(ql,qr,0,n-1,0);
    }
};

int main() {
    vector<int> arr;
    int n,m,x,op,y;
    fin>>n>>m;
    for(int i=0;i<n;i++){
        fin>>x;
        arr.push_back(x);
    }
    AInt aint(arr);
    for(int i=0;i<m;i++){
        fin>>op>>x>>y;
        if(op==0)
            fout<<aint.getMax(x-1,y-1)<<"\n";
        else
            aint.schimba(x-1,y);
    }

    return 0;
}