Cod sursa(job #2814348)

Utilizator LuciBBadea Lucian LuciB Data 7 decembrie 2021 23:00:25
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
// Teo, e cod vechi dar m-ai rugat sa fac iterativ :)

#include <bits/stdc++.h>
using namespace std;
const int NMAX=1e5;
const int INFINIT=1e9+7;
const int LEN=(1<<18);
const int LENBUF = (1 << 17);
int v[LEN/2], tree[LEN], maxx;
int lstart, rstart;
FILE *fin, *fout;

char buff[LENBUF], rbf = 0;

char readCh() {
    if(rbf == 0)
        fread(buff, 1, LENBUF, fin);
    char retval = buff[rbf];
    rbf = (rbf + 1) % LENBUF;
    return retval;
}

int readInt() {
    char ch;
    int n;
    while(!isdigit(ch = readCh()));
    n = 0;
    do {
        n = n * 10 + ch - '0';
    }while(isdigit(ch = readCh()));

    return n;
}

void build(int n){
    for(int i=0; i<n; i++)
        tree[i+n-1]=v[i];
    for(int i=n-2; i>=0; i--)
        tree[i]=max(tree[2*i+1], tree[2*i+2]);
}
void update(int poz, int val, int n){
    tree[poz+n-1]=val;
    int i=poz+n-1;
    while(i>0){
        if(i%2==1)
            tree[(i-1)/2]=max(tree[i], tree[i+1]);
        else
            tree[(i-1)/2]=max(tree[i], tree[i-1]);
        i=(i-1)/2;
    }
}
void maximum(int i, int l, int r){ /// node i has interval [l, r]
    if(rstart<l || lstart>r) return;
    else if(l>=lstart && r<=rstart){
        maxx=max(maxx, tree[i]);
        return;
    }else{
        int mid=(l+r)/2;
        maximum(2*i+1, l, mid);
        maximum(2*i+2, mid+1, r);
    }
}
int main(){
    int n, m, op, l, r;
    //cout<<(1<<18);
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    n = readInt();
    m = readInt();
    for(int i=0; i<n; i++) v[i] = readInt();
    int nn=1;
    while(nn<=n) nn<<=1;
    //cout<<nn<<endl;
    for(int i=n; i<nn; i++) v[i]=-INFINIT;
    build(nn);
    for(int i=0; i<m; i++){
        //int op, l, r;
        op = readInt();
        l = readInt();
        r = readInt();
        if(op==1){
            update(l-1, r, nn);
            //for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
        }else{
            maxx=-INFINIT;
            lstart=l-1;
            rstart=r-1;
            maximum(0, 0, nn-1);
            fprintf(fout, "%d\n", maxx);
        }
    }
    //for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
    return 0;
}