Cod sursa(job #2612508)

Utilizator CleliaClelia Maria Dobrescu Clelia Data 9 mai 2020 03:35:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int aint[400001],v[100001];
void build (int node,int l,int r)
{
    if (l>r)
        return;
    if (l==r)
    {
        aint[node]=v[l];
        return;
    }
    int mid=(l+r)/2;
    build(2*node,l,mid);
    build(2*node+1,mid+1,r);
    aint[node]=max(aint[2*node],aint[2*node+1]);
}
void update (int node,int l,int r,int poz,int val)
{
    if (l>r || poz>r || poz<l)
        return;
    if (l==r)
    {
        aint[node]=val;
        return;
    }
    int mid=(l+r)/2;
    update(2*node,l,mid,poz,val);
    update(2*node+1,mid+1,r,poz,val);
    aint[node]=max(aint[2*node],aint[2*node+1]);
}
int query (int node,int l,int r,int ql,int qr)
{
    if (l>r || l>qr || r<ql)
        return -1;
    if (ql<=l && r<=qr)
        return aint[node];
    int mid=(l+r)/2;
    int maxi=query(2*node,l,mid,ql,qr);
    maxi=max(maxi,query(2*node+1,mid+1,r,ql,qr));
    return maxi;
}
int main ()
{
    int n,m,i,tip,a,b;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];
    build (1,1,n);
    for (i=1;i<=m;i++)
    {
        fin>>tip>>a>>b;
        if (tip==0)
            fout<<query(1,1,n,a,b)<<'\n';
        else
            update(1,1,n,a,b);
    }
    return 0;
}