Cod sursa(job #1781092)

Utilizator martonsSoos Marton martons Data 16 octombrie 2016 17:57:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#define inf (1<<30)

using namespace std;
int n, m;
int v[300000];

void add(int nod, int st, int dr, int a, int b, int val){
    if(a <= st && dr <= b){
        ///actualizare
        if(v[nod]<val)v[nod] = val;
    }
    else{
        int mij = (st + dr)/2;
        if(a <= mij){
            add(2*nod, st, mij, a, b, val);
        }
        if(b > mij){
            add(2*nod+1, mij+1, dr, a, b, val);
        }
        ///actualizare
        if(v[nod]<val)v[nod] = val;

    }
}

int get(int nod, int st, int dr, int a, int b){
    if(st >= a && dr <= b){
        return v[nod];
    }
    else {
        int mij = (st+dr)/2;
        int s1=-inf, s2=-inf;
        if(a <= mij){
            s1 = get(2*nod, st, mij, a, b);
        }

        if(b > mij){
            s2 = get(2*nod+1, mij+1, dr, a, b);
        }

        return s1>s2?s1:s2;
    }
}

void update(int nod, int st, int dr, int pos, int val){
    if(pos == st && pos == dr){
        v[nod]=val;
    }
    else if(st <= pos && pos <= dr){
        int mij = (st+dr)/2;
        if(pos<=mij)
            update(2*nod, st, mij, pos, val);
        if(pos>mij)
            update(2*nod+1, mij+1, dr, pos, val);

        v[nod] = v[2*nod]>v[2*nod+1]?v[2*nod]:v[2*nod+1];
    }
}

int main()
{
    FILE* f = fopen("arbint.in", "r");
    FILE* f1 = fopen("arbint.out", "w");

    fscanf(f, "%d %d", &n, &m);

    for(int i=0;i<n;i++){
        int x;
        fscanf(f, "%d", &x);
        add(1, 1, n, i+1, i+1, x);
    }

    for(int i=0;i<m;i++){
        int x, a, b;
        fscanf(f, "%d %d %d", &x, &a, &b);
        if(x==0)
            fprintf(f1, "%d\n", get(1, 1, n, a, b));
        if(x==1)
            update(1, 1, n, a, b);
    }
    return 0;
}