Cod sursa(job #2304547)

Utilizator ptudortudor P ptudor Data 18 decembrie 2018 10:28:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,aint[400005],a[400005];
void constr()
{int i;
    int N=2*n-1;
    for (i=n;i<=N;i++)
        aint[i]=a[i-n+1];
    for (i=n-1;i>=1;i--)
        aint[i]=max(aint[i*2],aint[i*2+1]);
}
void update(int p,int x)
{
    p=p+n-1;
    aint[p]=x;
    p/=2;
    while (p>0)
    {
        aint[p]=max(aint[p*2],aint[p*2+1]);
        p/=2;
    }
}
int query(int p,int x,int y,int st,int dr)
{
    if (st==x&&dr==y)
        return aint[p];
    int mij=(st+dr)/2;
    if (y<=mij)
        return query(2*p,x,y,st,mij);
    if (x>mij)
        return query(2*p+1,x,y,mij+1,dr);
    return max(query(2*p,x,mij,st,mij),query(2*p+1,mij+1,y,mij+1,dr));
}
void Resize()
{int k;
    for (k=1;k<n;k*=2)
        ;
    n=k;
}
int main()
{int i,x,tip,y;
    in>>n>>m;
    for (i=1;i<=n;i++)in>>a[i];
    Resize();
    constr();
    for (i=1;i<=m;i++)
    {
        in>>tip>>x>>y;
        if (tip==0)
        {
            out<<query(1,x,y,1,n)<<"\n";
        }
        else
        {
            update(x,y);
        }
    }
}