Cod sursa(job #3005706)

Utilizator cyg_dragos10Ivan Dragos cyg_dragos10 Data 17 martie 2023 10:22:25
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <map>
#include <vector>

using namespace std;

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

const int NMAX = 100005;

int aint[NMAX],n,v[NMAX];

void init(int node,int left,int right){
    if(left == right)
    {
        aint[node] = v[left];
        return;
    }
    int mid = left + (right -  left) / 2;
    init(2 * node,left,mid);
    init(2 * node + 1,mid + 1,right);
    aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}

void update(int node,int left,int right,int poz,int val){
    if(left == right)
    {
        aint[node] = val;
        return;
    }
    int mid = left + (right - left) / 2;
    if(mid >= poz)
        update(2 * node,left,mid,poz,val);
    else
        update(2 * node + 1,mid +1,right,poz,val);
     aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}

int query(int node,int left,int right,int leftq,int rightq){
    if(leftq <= left && right <= rightq)
        return aint[node];
    int mid = left + (right - left) / 2,ans1,ans2;
    ans1 = ans2 = 0;
    if(leftq <= mid)
        ans1 = query(2 * node,left, mid,leftq,rightq);
    if(rightq > mid)
        ans2 = query(2 * node + 1,mid + 1,right,leftq,rightq);
    return max(ans1,ans2);
}
int main()
{
    int m;
    fin>>n>>m;
    int q,x,y;
    for(int i = 1;i <= n;i++)
    {
        fin>>v[i];
    }
    init(1,1,n);
    for(int i = 1;i <= m;i++){
        fin>>q>>x>>y;
        if(q == 0)
            fout<<query(1,1,n,x,y)<<"\n";
        else
            update(1,1,n,x,y);
    }
    return 0;
}