Cod sursa(job #1567305)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 13 ianuarie 2016 08:45:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
using namespace std;

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

int N, Q, A, B, x, y, z, maxim;
int Arb[400001];

void Update(int node, int left, int right);
void Query(int node, int left, int right);

int main()
{
    is >> N >> Q;
    B = N;
    for (int i = 1; i <= N; ++i)
    {
        is >> x;
        A = i;
        B = x;
        Update(1,1,N);
    }

    for (int i = 1; i <= Q; ++i)
    {
        is >> z >> x >> y;

        if (z == 0)
        {
            maxim = -9999999;
            A = x;
            B = y;
            Query(1,1,N);
            os << maxim << '\n';
        }
        else
        {
            A = x;
            B = y;
            Update(1,1,N);
        }
    }

    is.close();
    os.close();
}

void Update(int node, int left, int right)
{
    if (left == right)
    {
        Arb[node] = B;
        return;
    }

    int mid = (left + right)/2;

    if (A <= mid)
        Update(2*node, left, mid);
    else
        Update(2*node+1, mid+1, right);

    Arb[node] = max(Arb[2*node],Arb[2*node+1]);
}

void Query(int node, int left, int right)
{
    if (left >= A && right <= B)
    {
        maxim = max(maxim, Arb[node]);
        return;
    }

    int mid = (left + right)/2;

    if (A <= mid)
        Query(2*node, left, mid);
    if (B > mid)
        Query(2*node+1, mid+1, right);
}