Cod sursa(job #2165948)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 13 martie 2018 14:35:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 100005
#define INF 1000000010

int n, m, ai[NMAX * 4], a[NMAX];
pair<int, int> seg[NMAX * 4];

void BuildTree(int node, int low, int high) {

    seg[node].first = low;
    seg[node].second = high;

    if(low == high) {
        ai[node] = a[low];
        return;
    }

    int mid = (low + high)/2;
    BuildTree(node * 2 + 1, low, mid);
    BuildTree(node * 2 + 2, mid + 1, high);

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

}

void Update(int node, int low, int high, int poz, int val) {

    if(low == high && low == poz) {
        ai[node] = val;
        return;
    }

    int mid = (low + high)/2;

    if(low <= poz && poz <= mid)
        Update(node * 2 + 1, low, mid, poz, val);
    else
        Update(node * 2 + 2, mid+1, high, poz, val);

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

}

int querry(int node, int low, int high) {

    if(low <= seg[node].first && high >= seg[node].second)
        return ai[node];

    if(low > seg[node].second || high < seg[node].first)
        return (-1) * INF;

    int mid = (low + high)/2;
    int left = querry(node * 2 + 1, low, high);
    int right = querry(node * 2 + 2, low, high);
    return max(  left, right );
}

int main(){

    int i, j, x, y, test;
    FILE *fin, *fout;
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    for(i=0; i<n; i++)
        fscanf(fin, "%d ", &a[i]);

    BuildTree(0, 0, n-1);

    for(i=1; i<=m; i++) {
        fscanf(fin, "%d ", &test);
        if(!test) {
            fscanf(fin, "%d %d", &x, &y);
            x--;
            y--;
            fprintf(fout, "%d\n", querry(0, x, y));
        }
        else {
            fscanf(fin, "%d %d", &x, &y);
            x--;
            Update(0, 0, n-1, x, y);
        }
    }

    return 0;
}