Cod sursa(job #1915673)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 8 martie 2017 22:01:14
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMax = 100005;

int N, M;
int ai[NMax], v[NMax];

void Build(int st, int dr, int pai)
{
    if(st == dr)
    {
        ai[pai]=v[st];
        return;
    }

    int mij=st+(dr-st)/2;

    Build(st, mij, 2*pai);
    Build(mij+1, dr, 2*pai+1);

    ai[pai]=max(ai[2*pai], ai[2*pai+1]);
}

int a,b,maxi;

void Update(int st, int dr, int pai)
{
    if(st == dr)
    {
        ai[pai]=b;
        return;
    }

    int mij=st+(dr-st)/2;

    if(a<=mij)
        Update(st,mij,2*pai);

    else
        Update(mij+1,dr,2*pai+1);

    ai[pai]=max(ai[2*pai], ai[2*pai+1]);
}

void Query(int st, int dr, int pai)
{
   if( a<=st && b>=dr )
   {
       maxi=max(maxi,ai[pai]);
       return;
   }

   int mij=st+(dr-st)/2;

   if(a<=mij)
        Query(st, mij, 2*pai);

   if(b>mij)
        Query(mij+1, dr, 2*pai+1);
}


void Read()
{
    scanf("%d %d", &N, &M);

    for(int i=1; i<=N; ++i)
        scanf("%d", &v[i]);

    Build(1, N, 1);

    for(int i=1; i<=M; ++i)
    {
        int t;
        scanf("%d %d %d", &t, &a, &b);

        if(t==0)
            { maxi=-1;
              Query(1, N, 1);
              printf("%d\n", maxi);
            }

        else
            Update(1, N, 1);
    }

}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    Read();

    return 0;
}