Cod sursa(job #1363723)

Utilizator PetrutiuPaulPetrutiu Paul Gabriel PetrutiuPaul Data 27 februarie 2015 10:33:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

    ifstream fin("arbint.in");
    ofstream fout("arbint.out");

int arb[450000];
int pos,maxim,start,finish,val;


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

    int mid=(left+right)/2;

    if(pos<=mid)up(2*nod,left,mid);
    else up(2*nod+1,mid+1,right);

    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void Q(int nod,int left,int right)
{
    if(start<=left && right<=finish)
    {
        if(maxim<arb[nod])maxim=arb[nod];
        return;
    }

    int mid=(left+right)/2;

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

int main()
{
    int a,b,n,m,x;

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

        pos=i;val=x;

        up(1,1,n);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>a>>b;
        if(x==0)
        {
            maxim=-1;
            start=a;
            finish=b;
            Q(1,1,n);

            fout<<maxim<<'\n';
        }
        else
        {
            pos=a;
            val=b;
            up(1,1,n);
        }
    }
}