Cod sursa(job #2380129)

Utilizator EmplopiStefan Nitu Emplopi Data 14 martie 2019 16:11:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>

int poz;
int v[265000];

int maxim(int a, int b){
    if(a>b)
        return a;
    return b;
}

void update(int i){
    if(i!=1){
        i/=2;
        v[i]=maxim(v[i*2], v[i*2+1]);
        update(i);
    }
}

int calcul(int st, int dr, int i, int j, int x){
    if(st<=i && dr>=j)
        return v[x];
    if(st>j || dr<i)
        return 0;

    return maxim(calcul(st, dr, i, (i+j)/2, x*2), calcul(st, dr, (i+j)/2+1, j, x*2+1));
}

int main(){
    FILE *fin, *fout;
    int n, m, i, t, a, b;
    fin=fopen("arbint.in", "r");
    fout=fopen("arbint.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    poz=1;
    while(poz<n)
        poz*=2;
    for(i=1;i<=n;i++){
        fscanf(fin, "%d", &v[poz+i-1]);
        update(poz+i-1);
    }
    for(i=0;i<m;i++){
        fscanf(fin, "%d%d%d", &t, &a, &b);
        if(t==1){
            v[poz+a-1]=b;
            update(poz+a-1);
        }
        else
            fprintf(fout, "%d\n", calcul(a, b, 1, poz, 1));
    }
    fclose(fin);
    fclose(fout);

    return 0;
}