Cod sursa(job #2177791)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 18 martie 2018 20:24:26
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
using namespace std;
#define MAX(a,b) (a>b ? a : b)
const int nmax=100000;
int n,v[nmax+5],A[3*nmax+5];
void build(int st,int dr,int poz)
{
    if(st==dr)
    {
        A[poz]=v[st];
        return;
    }
    int med=(st+dr)/2;
    build(st,med,2*poz);
    build(med+1,dr,2*poz+1);
    A[poz]=MAX(A[2*poz],A[2*poz+1]);
}
void update(int cine,int st,int dr,int poz)
{
    if(cine<st || dr<cine)
        return;
    if(st==dr)
    {
        A[poz]=v[st];
        return;
    }
    int med=(st+dr)/2;
    update(cine,st,med,2*poz);
    update(cine,med+1,dr,2*poz+1);
    A[poz]=MAX(A[2*poz],A[2*poz+1]);
}
int slove(int a,int b,int st,int dr,int poz)
{
    if(dr<a || b<st)
        return -(1<<30);
    if(a<=st && dr<=b)
        return A[poz];
    int med=(st+dr)/2;
    return MAX(slove(a,b,st,med,2*poz),slove(a,b,med+1,dr,2*poz+1));
    return 0;
}
int T;
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&T);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    build(1,n,1);
    while(T--)
    {
        int tip,a,b;
        scanf("%d%d%d",&tip,&a,&b);
        if(tip==0)
          printf("%d\n",slove(a,b,1,n,1));
        else
        {
            v[a]=b;
            update(a,1,n,1);
        }
    }
    return 0;
}
/**
**/