Cod sursa(job #2990928)

Utilizator cyg_dragos10Ivan Dragos cyg_dragos10 Data 8 martie 2023 19:31:13
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.06 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int aint[NMAX * 2],v[NMAX];

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

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(poz <= mid)
        update(node * 2,left, mid, poz, val);
    else
        update(node * 2 + 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(node * 2, left, mid, leftq,rightq);
    if(mid < rightq)
        ans2 = query(node * 2 + 1, mid + 1, right, leftq, rightq);
    return max(ans1,ans2);
}

int main()
{
    int n,m;
    fin>>n>>m;
    for(int i = 1;i <= n;i++)
        fin>>v[i];
    build(1,1,n);
    int q,x,y;
    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;
}
/*
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int v[NMAX],aint[2 * NMAX];

void build(int node,int left,int right){
    if(left == right){
        aint[node] = v[left];
        return;
    }
    int mid = left + (right - left) / 2;
    build(2 * node,left, mid);
    build(2 * node,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(poz <= mid)
        update(node * 2,left,mid,poz,val);
    else
        update(node * 2 + 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 = 0,ans2 = 0;
    if(leftq <= mid)
        ans1 = query(2* node, left, mid,leftq,rightq);
    else
        ans2 = query(2 * node + 1,mid + 1,right,leftq,rightq);
    return max(ans1,ans2);
}
int main()
{
    int n,m;
    fin>>n>>m;
    for(int i = 1;i <= n;i++)
        fin>>v[NMAX];
    build(1,1,n);
    int q,x,y;
    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;
}
*/