Cod sursa(job #2884156)

Utilizator cdenisCovei Denis cdenis Data 2 aprilie 2022 14:52:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAX=4e5+5;
int n,m,op,tree[MAX];

void update(int node, int st, int dr, int val, int pos)
{
    if(st==dr)
    {
        tree[node]=val;
        return;
    }
    int m=(st+dr)/2;
    if(pos<=m)
        update(2*node,st,m,val,pos);
    else
        update(2*node+1,m+1,dr,val,pos);
    tree[node]=max(tree[2*node],tree[2*node+1]);
}

int query(int node, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b)
        return tree[node];
    int m=(st+dr)/2;
    int v1=-1,v2=-1;
    if(a<=m)
        v1=query(2*node,st,m,a,b);
    if(m<b)
        v2=query(2*node+1,m+1,dr,a,b);
    return max(v1,v2);
}

int main()
{
    fin >> n >> m;
    for(int i=1;i<=n;i++)
    {
        int val;
        fin >> val;
        update(1,1,n,val,i);
    }
    while(m--)
    {
        fin >> op;
        if(op==0)
        {
            int a,b;
            fin >> a >> b;
            fout << query(1,1,n,a,b) << '\n';
        }
        else
        {
            int pos,val;
            fin >> pos >> val;
            update(1,1,n,val,pos);
        }
    }
    return 0;
}