Nu aveti permisiuni pentru a descarca fisierul grader_test8.in

Cod sursa(job #2453976)

Utilizator patrickdanDan patrick patrickdan Data 6 septembrie 2019 21:07:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int r[100001];
int t[400001];
void build(int v,int tl,int tr)
{
    if(tl==tr)
        t[v]=r[tl];
    else
    {
        int med=(tl+tr)/2;
        build(v*2,tl,med);
        build(v*2+1,med+1,tr);
        t[v]=max(t[2*v],t[2*v+1]);
    }
}

int query(int v,int tl,int tr,int l,int r)
{
    if(l>r)
        return 0;
    if(l==tl && r==tr)
        return t[v];
    int med=(tl+tr)/2;
    return max(query(v*2,tl,med,l,min(r,med)),query(v*2+1,med+1,tr,max(med+1,l),r));
}
void update(int v,int tl,int tr,int p,int nv)
{
    if(tl==tr)
        t[v]=nv;
     else
     {
         int med=(tl+tr)/2;
         if(p<=med)
            update(2*v,tl,med,p,nv);
         else
            update(2*v+1,med+1,tr,p,nv);
         t[v]=max(t[2*v],t[2*v+1]);
     }
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int m,n;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&r[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        scanf("%d%d%d",&t,&a,&b);
        if(t==0)
            printf("%d\n",query(1,1,n,a,b));
        else
            update(1,1,n,a,b);
    }
    return 0;
}