Cod sursa(job #2335925)

Utilizator Anime_LoverAnime Lover Anime_Lover Data 4 februarie 2019 17:16:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

#define dim 1000001

long int MaxArb[4*dim+66],n,m,val,poz,x,st,fn,maxim;

ifstream fi("arbint.in");
ofstream fo("arbint.out");

long int Maxim(long int a, long int b)
{
    if(a>b)
        return a;
    else
        return b;
}

void update(long int nod, long int left, long int right)
{
    if(left==right)
    {
        MaxArb[nod]=val;
        return;
    }

    long int div=(left+right)/2;

    if(poz<=div)
        update(2*nod,left,div);
    else
        update(2*nod+1,div+1,right);

    MaxArb[nod]=Maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}

void query(long int nod, long int left, long int right)
{
    if(st<=left && right<=fn)
    {
        if(maxim<MaxArb[nod])
            maxim=MaxArb[nod];
        return;
    }

    long int div=(left+right)/2;

    if(st <= div)
        query(2*nod,left,div);
    if(div < fn)
        query(2*nod+1,div+1,right);
}


int main()
{
    fi>>n>>m;

    for(long int i=1;i<=n;i++)
    {
        poz=i;
        fi>>val;

        update(1,1,n);
    }

    for(long int i=1;i<=m;i++)
    {
        fi>>x;

        if(x==0)
        {

            fi>>st;
            fi>>fn;

            maxim= -1;

            query(1,1,n);

            fo<<maxim<<'\n';
        }
        else
        {
            fi>>poz;
            fi>>val;

            update(1,1,n);
        }
    }



    return 0;
}