Cod sursa(job #1085766)

Utilizator TeOOOVoina Teodora TeOOO Data 17 ianuarie 2014 13:09:58
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
//Include
#include <fstream>
#include <algorithm>
using namespace std;

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

//Constante
const int sz = (int)1e5+1;

//Definitii
#define leftSon 2*node
#define rightSon 2*node + 1

//Functii
void update (int node, int left, int right);
void query (int node, int left, int right);

//Variabile
int num, questions;
int position, val;
int leftLimit, rightLimit;
int tree[4*sz];

//Main
int main()
{

    in >> num >> questions;
    for(position=1; position<=num; ++position)
    {
        in >> val;
        update(1, 1, num);
    }

    while(questions--)
    {
        int type;
        in >> type;
        if(type)
        {
            in >> position >> val;
            update(1, 1, num);
        }
        else
        {
            in >> leftLimit >> rightLimit;
            val = 0;
            query(1, 1, num);
            out << val << '\n';
        }
    }

	in.close();
	out.close();
	return 0;
}

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

    int mid = (left + right) / 2;

    if(position <= mid)
        update(leftSon, left, mid);
    else
        update(rightSon, mid+1, right);

    tree[node] = max(tree[leftSon], tree[rightSon]);
}

void query (int node, int left, int right)
{
    if(leftLimit <= left && right <= rightLimit)
    {
        val = max(val, tree[node]);
        return;
    }

    int mid = (left + right) / 2;

    if(leftLimit <= mid)
        query(leftSon, left, mid);
    if(mid < rightLimit)
        query(rightSon, mid+1, right);
}