Cod sursa(job #1119170)

Utilizator fhandreiAndrei Hareza fhandrei Data 24 februarie 2014 15:50:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
// Include
#include <fstream>
#include <algorithm>
using namespace std;
 
// Definitii
#define leftSon (node<<1)
#define rightSon (node<<1)+1
 
// Constante
const int sz = (int)1e5+1;
 
// Functii
void update(int node, int left, int right);
void query(int node, int left, int right);
 
// Variabile
ifstream in("arbint.in");
ofstream out("arbint.out");
 
int num;
int questions, type;
int pos, val;
int leftRange, rightRange;
 
int tree[sz<<2];
 
// Main
int main()
{
    in >> num >> questions;
    for(pos=1 ; pos<=num ; ++pos)
        in >> val, update(1, 1, num);
     
    while(questions--)
    {
        in >> type;
        if(type)
        {
            in >> pos >> val;
            update(1, 1, num);
        }
        else
        {
            in >> leftRange >> rightRange;
            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)>>1;
     
    if(pos <= 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(leftRange <= left && right <= rightRange)
    {
        val = max(val, tree[node]);
        return;
    }
     
    int mid = (left+right)>>1;
     
    if(leftRange <= mid)
        query(leftSon, left, mid);
    if(mid < rightRange)
        query(rightSon, mid+1, right);
}