Cod sursa(job #1007784)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 9 octombrie 2013 18:54:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100000+5
#define KMAX (1<<17+5)
using namespace std;
int N,M,K,A,B;
int AI[KMAX];
void update(int i,int x)
{
    int t;
    AI[K+i-1]=x;
    for(t=(K+i-1)/2;t;t>>=1) AI[t]=max(AI[2*t],AI[2*t+1]);
}
int query(int nod,int lo,int hi)
{
    int md=(lo+hi)/2;
    if(A<=lo && hi<=B) return AI[nod];
    if(hi<A || B<lo) return 0;
    return max(query(2*nod,lo,md),query(2*nod+1,md+1,hi));
}
int main()
{
    int i,t,a,b;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(K=1;K<N;K<<=1);
    for(i=1;i<=N;i++) scanf("%d",&AI[K+i-1]);
    for(i=K-1;i>=1;--i) AI[i]=max(AI[2*i],AI[2*i+1]);
    //for(i=1;i<=2*K-1;i++) printf("%d ",AI[i]); printf("\n");
    for(;M;--M)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(t==1)
        {
            update(a,b);
            //for(i=1;i<=2*K-1;i++) printf("%d ",AI[i]); printf("\n");
            continue;
        }
        A=a; B=b;
        printf("%d\n",query(1,1,K));
    }
    return 0;
}