Cod sursa(job #3263852)

Utilizator tudorhTudor Horobeanu tudorh Data 16 decembrie 2024 16:53:32
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[100001];
int t[400001];
void build(int v,int st,int dr)
{
    if(st==dr)
        t[v]=a[st];
    else
    {
        int mid=(st+dr)/2;
        build(v*2,st,mid);
        build(v*2+1,mid+1,dr);
        t[v]=max(t[v*2],t[v*2+1]);
    }
}
void update(int v,int st,int dr,int pos,int val)
{
    if(st==dr)
        t[v]=val;
    else
    {
        int mid=(st+dr)/2;
        if(pos<=mid)
            update(v*2,1,mid,pos,val);
        else update(v*2+1,mid+1,dr,pos,val);
        t[v]=max(t[v*2],t[v*2+1]);
    }
}
int query(int v,int st,int dr,int qst,int qdr)
{
    if(st>=qst && dr<=qdr)
        return t[v];
    else if(st>qdr || dr<qst)
        return -1e9;
    else
    {
        int mid=(st+dr)/2;
        return max(query(v*2,1,mid,qst,qdr),query(v*2+1,mid+1,dr,qst,qdr));
    }
}
int main()
{
    int n,m,st,dr,type;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        fin>>type>>st>>dr;
        if(type==0)
            fout<<query(1,1,n,st,dr)<<'\n';
        else update(1,1,n,st,dr);
    }
    return 0;
}