Cod sursa(job #2243158)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 20 septembrie 2018 00:05:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define dimn 100005

// Am dat reupload ca aparea cu 0 pct in arhiva si ma facea trist
std::ifstream f("arbint.in");
std::ofstream g("arbint.out");

int N, Q;
int tree[4*dimn+50];

void update(int pos, int value, int nod=1, int left=1, int right=N) {
     int mij = (left+right)/2;
     if (left == right) {
          tree[nod] = value;
          return;
     }

     if (pos <= mij) update(pos, value, 2*nod, left, mij);
     else update(pos, value, 2*nod+1, mij+1, right);
     tree[nod] = std::max(tree[2*nod], tree[2*nod+1]);
}
int max_interval(int s, int d, int nod=1, int left=1, int right=N) {
    if(s<=left && right<=d)
        return tree[nod];

    int mij = (left+right)/2, max = 0;
    if(s<=mij) max = std::max(max, max_interval(s, d, 2*nod, left, mij));
    if(mij<d) max = std::max(max, max_interval(s, d, 2*nod+1, mij+1, right));
    return max;
}

void citire() {
    f >> N >> Q;
    for (int i=0, x; i<N; i++) {
        f >> x;
        update(i+1, x);
    }
}
void rezolvare() {
    for (int i=0, t, y, x; i<Q; i++) {
        f >> t >> y >> x;
        if(t==0) g << max_interval(y, x) << "\n";
        else update(y, x);
    }
}

int main()
{
    citire();
    rezolvare();

    return 0;
}