Cod sursa(job #1507953)

Utilizator LurchssLaurentiu Duma Lurchss Data 22 octombrie 2015 08:34:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define nmax 100005
using namespace std;

int A,B,Poz,Val,Op;
int Arb[nmax*4];
int n,m,X;
int maxim;

void Update(int n,int left,int right)
{
    if(left==right)
    {
        Arb[n]=Val;
        return;
    }
    int m=(left+right)/2;
    if(Poz<=m)
        Update(2*n,left,m);
    else
        Update(2*n+1,m+1,right);
    Arb[n]=max(Arb[2*n],Arb[2*n+1]);
}

void Query(int n,int left,int right)
{
    if(A<=left && right<=B)
    {
        maxim=max(maxim,Arb[n]);
        return;
    }
    int mij=(left+right)/2;
    if(A<=mij)
        Query(2*n,left,mij);
    if(B>mij)
        Query(2*n+1,mij+1,right);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d ",&X);
        Val=X;
        Poz=i;
        Update(1,1,n);
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&X,&A,&B);
        if(X==0)
        {
            maxim = -1;
            Query(1,1,n);
            printf("%d\n",maxim);
        }
        else
        {
            Poz=A;
            Val=B;
            Update(1,1,n);
        }
    }
    return 0;
}