Cod sursa(job #825554)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 29 noiembrie 2012 10:47:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <cstdlib>
#include <cstdio>
#define MAX_SIZE 100000

int arb[MAX_SIZE * 3];
int N , NR_OP;
int maxval = -1;


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

void Update_Tree(int nod , int value ,int vector_pos , int left , int right)
{
    if (left == right)
    {
        arb[nod] = value;
        return;
    }
    int middle = (left + right) / 2;
    if (vector_pos <= middle )
    {
        Update_Tree(2*nod,value,vector_pos,left,middle);
    }
    else
    {
        Update_Tree(2*nod + 1,value,vector_pos,middle+1,right);
    }
    arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);

}

void Query_Tree(int nod , int A , int B ,  int left , int right)
{
    if (A <= left && right <= B)
    {
        if (maxval < arb[nod])
        {
            maxval = arb[nod];
        }
        return;
    }
    int middle = (left + right) / 2;
    if (A <= middle) Query_Tree(2*nod,A,B,left,middle);
    if (B > middle ) Query_Tree(2*nod+1,A,B,middle+1,right);
}

using namespace std;

int main()
{
    ifstream input("arbint.in");
    ofstream output("arbint.out");
    input >> N >> NR_OP;
    for (int i=1;i<=N;i++)
    {
        int x;
        input >> x;
        Update_Tree(1,x,i,1,N);
    }
    for (int i = 0;i<NR_OP;i++)
    {
        int x;
        input >> x;
        if (x == 0)
        {
            int start , finish;
            input >> start >> finish;
            maxval = -1;
            Query_Tree(1,start,finish,1,N);
            output << maxval << "\n";
        }
        if (x == 1)
        {
            int poz;
            int val;
            input >> poz >> val;
            Update_Tree(1,val,poz,1,N);
        }
    }
    input.close();
    output.close();
    return 0;
}