Cod sursa(job #1229228)

Utilizator cdascaluDascalu Cristian cdascalu Data 16 septembrie 2014 19:17:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#define Nmax 4*100001
using namespace std;

int ARB[Nmax], l, r, val, N, M;

void init(int node, int left, int right)
{
    ARB[node] = 0;
    if(left >= right)
        return;

    int mid = (left + right)/2;
    init(node*2, left, mid);
    init(node*2 + 1, mid+1, right);
}
void update(int node, int left, int right)
{
    if(l <= left && right <= r)
    {
        ARB[node] = val;
        return;
    }

    if(left >= right)
        return;

    int mid = (left + right)/2;
    if(l <= mid)
        update(node*2, left, mid);
    else
        update(node*2 + 1, mid+1, right);
    ARB[node] = max(ARB[node*2], ARB[node*2 + 1]);
}

int query(int node, int left, int right)
{
    if(l <= left && right <= r)
        return ARB[node];

    if(left >= right)
        return -1;

    int mid = (left + right)/2, a = -1, b = -1;

    if(mid >= l)
        a = query(node*2, left, mid);
    if(mid < r)
        b = query(node*2 + 1, mid+1, right);

    return max(a,b);
}
int main()
{
    init(1,1,N);
    ifstream f("arbint.in");

    f>>N>>M;
    int op;
    for(int i=1;i<=N;++i)
    {
        f>>val;
        l = r = i;
        update(1,1,N);
    }

    ofstream g("arbint.out");
    while(M--)
    {
        f>>op;
        if(op == 0)
        {
            f>>l>>r;
            g<<query(1,1,N)<<"\n";
        }
        else
        {
            f>>l>>val;
            r = l;
            update(1,1,N);
        }
    }
    f.close();
    g.close();
    return 0;
}