Cod sursa(job #2442742)

Utilizator Adrian_Popescu311Popescu Adrian Adrian_Popescu311 Data 25 iulie 2019 10:23:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

#define M 100010

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

long int ma[4*M+60];
long int n,m;
long int poz,val;
long int start,finish;
long int maxx;

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

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

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

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

    ma[nod]=maxim(ma[2*nod],ma[2*nod+1]);
}

void query(long int left,long int right,long int nod)
{
    if(start<=left&&right<=finish)
    {
        if(maxx<ma[nod])
            maxx=ma[nod];

        return;
    }

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

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

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

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

    for(int i=1;i<=m;i++)
    {
        int x;
        fi>>x;
        if(x==0)
        {
            fi>>start>>finish;
            maxx=-1;
            query(1,n,1);
            fo<<maxx<<'\n';
        }
        else
        {
            fi>>poz>>val;
            update(1,n,1);
        }
    }

    return 0;
}