Cod sursa(job #1308664)

Utilizator SorinmocanuFMI Sorin Mocanu Sorinmocanu Data 4 ianuarie 2015 15:40:48
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<iostream>
#include <fstream>
using namespace std;

#define dim 100001
int n,m,MaxArb[4*dim+66],start,finish,Val,Pos,maxim;

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

void Update(int nod,int left,int right)
{
     if (left==right)
     {MaxArb[nod]=Val; return;}
     int div=(left+right)/2;
     if(Pos<=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(int nod,int left,int right)
{
     if(start<=left&&right<=finish)
     {if ( maxim < MaxArb[nod] ) maxim = 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 x,a,b,i;
    ifstream f("arbint.in");
    ofstream g("arbint.out");

    f>>n>>m;
    for(i=1;i<=n;i++)
    {   f>>x;
        Pos=i, Val=x;
        Update(1,1,n);}

    for(i=1;i<=m;i++)
    {   f>>x>>a>>b;
        if(x==0)
        {    maxim=-1;
             start=a; finish=b;
             Query(1,1,n);
             g<<maxim<<endl;}
        else
        {   Pos=a; Val=b;
            Update(1,1,n);}
    }
    f.close();
    g.close();
    return 0;
}