Cod sursa(job #2335816)

Utilizator Anime_LoverAnime Lover Anime_Lover Data 4 februarie 2019 15:39:54
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

#define dim 100001

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

int MaxArb[4*dim+66];
int poz,val,start,finish,x,maximal;
int n,m;

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

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

    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*n],MaxArb[2*nod+1]);

}

void query(int nod, int left, int right)
{
    if( start<=left && right<=finish )
        {if(maximal < MaxArb[nod])
            maximal = MaxArb[nod];
        return;}

    int div=(left+right)/2;

    if( start <= div )
        query(2*nod,left,div);

    if( div < finish )
        query(2*nod+1,div+1,right);
}

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

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

            update(1,1,n);
        }

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

        if(x==0)
        {
            maximal=0;

            fi>>start;
            fi>>finish;

            query(1,1,n);

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

            update(1,1,n);
        }

    }

    return 0;

}