Cod sursa(job #1820359)

Utilizator dinu2000Enescu Dinu dinu2000 Data 1 decembrie 2016 16:49:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#define MAXN 100000

using namespace std;

FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");

int N, M, MAX;
int v[MAXN + 1], arb[4 * MAXN];

int max(int a , int b)
{
    return a > b ? a : b;
}

void BUILD(int node, int left, int right)
{
    if(right == left){
        arb[node] = v[left];
        return;
    }

    int mid = (left + right)/2;

    BUILD(node * 2, left, mid);
    BUILD(node * 2 + 1, mid + 1, right);

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

void UPDATE(int node, int left, int right, int pos, int val)
{
    if(left == right)
    {
        arb[node] = val;
        return;
    }

    int mid = (left + right)/2;

    if(pos <= mid)
        UPDATE(node * 2, left, mid, pos, val);

    else
        UPDATE(node * 2 + 1, mid + 1, right, pos, val);

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

void QUERY(int node, int left, int right, int a, int b)
{
    if(a <= left && right <= b)
    {
        MAX = max(MAX , arb[node]);
        return;
    }

    int mid = (left + right)/2;

    if(a <= mid)
        QUERY(node * 2, left, mid, a, b);

    if(mid < b)
        QUERY(node * 2 + 1, mid+1, right, a, b);
}

int main()
{
    int i, type, a, b;

    fscanf(fin, "%d %d", &N, &M);

    for(i=1; i<=N; i++)
    {
        fscanf(fin, "%d", &v[i]);
    }

    BUILD(1, 1, N);

    for(i=1; i<=M; i++)
    {
        fscanf(fin, "%d %d %d", &type, &a, &b);

        if(type == 0){
            MAX = 0;
            QUERY(1, 1, N, a, b);
            fprintf(fout, "%d\n", MAX);
        }

        else{
            UPDATE(1, 1, N, a, b);
        }

    }

    return 0;
}