Cod sursa(job #942830)

Utilizator andreiagAndrei Galusca andreiag Data 23 aprilie 2013 17:38:32
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>

#define LEN 100005

using namespace std;

typedef long long LL;

LL A[2*LEN];
int c = 1;

void insert(int pos, LL n)
{
    int i = pos + c - 1;
    A[i] = n;
    i /= 2;
    while(i) {
        A[i] = (A[2*i] > A[2*i+1]) ? A[2*i] : A[2*i + 1];
        i /= 2;
    }
}

LL maximum(int nod, int s, int f, int a, int b)
{
    if(a <= s && f <= b) return A[nod];
    int mid = (s + f) / 2;
    LL l = 0, r = 0;
    if (a <= mid) l = maximum(2*nod, s, mid, a, b);
    if (b >  mid) r = maximum(2*nod + 1, mid + 1, f, a, b);

    return (l > r) ? l : r;
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int N, M;
    scanf("%d %d\n", &N, &M);

    while(c < N) {c *= 2;}

    for(int i = 0; i < 2*c; i++) A[i] = 0;

    for(int i = c; i < N + c; i++)
        scanf("%lld", &A[i]);

    for(int i = c - 1; i; i--) {
        A[i] = (A[2*i] > A[2*i+1] ) ? A[2*i] : A[2*i+1];
    }
    /*
    cout << maximum(1, 1, 8, 1, 3) << endl;

    for(int i = 0; i < 2*c; i++)
        cout << A[i] << ' ';
    cout << endl;

    insert(3, 2);

    for(int i = 0; i < 2*c; i++)
        cout << A[i] << ' ';
    cout << endl;
    */


    int t,x,y;
    LL n;
    for(int i = 0; i < M; i++) {
        scanf("%d ", &t);
        if (t == 0) {
            scanf("%d %d\n", &x, &y);
            n = maximum(1, 1, c, x, y);
            printf("%lld\n", n);}
        else {scanf("%d %lld", &x, &n);
              insert(x, n);}
    }

    return 0;
}