Cod sursa(job #1053171)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 12 decembrie 2013 14:39:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 100005;
int N,M,i,X,W,Poz,Val,A,B,Arb[1<<18],R;
void Update(int Node,int Left,int Right)
{
    if(Left==Right) {Arb[Node]=Val; return;}
    int Middle=(Left+Right)/2;
    if(Poz<=Middle) Update(Node*2,Left,Middle);
    else Update(Node*2+1,Middle+1,Right);
    Arb[Node]=max(Arb[2*Node],Arb[2*Node+1]);
}
void Query(int Node,int Left,int Right)
{
    if(Left>=A && Right<=B) {R=max(R,Arb[Node]); return;}
    int Middle=(Left+Right)/2;
    if(A<=Middle) Query(Node*2,Left,Middle);
    if(B>Middle) Query(Node*2+1,Middle+1,Right);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(i=1;i<=N;i++)
    {
        scanf("%d",&X);
        Poz=i; Val=X;
        Update(1,1,N);
    }
    for(;M;M--)
    {
        scanf("%d",&W);
        if(W)
        {
            scanf("%d%d",&Poz,&Val);
            Update(1,1,N);
        }
        else
        {
            scanf("%d%d",&A,&B);
            R=0; Query(1,1,N);
            printf("%d\n",R);
        }
    }
    return 0;
}