Cod sursa(job #2197178)

Utilizator problem_destroyer69Daniel Hangan problem_destroyer69 Data 21 aprilie 2018 12:47:53
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define INF 1000000005
#define LINF 1000000000000000005
#define MAXN 1000005
#define pi pair<int,int>
#define pl pair<ll,ll>

int n,m,nr;
int tree[MAXN];

int maxim(int a, int b){
    a += nr-1, b += nr-1;
    int maxx=0;
    while (a <= b){
        if (a%2) maxx = max(maxx,tree[a++]);
        if (!(b%2)) maxx = max(maxx,tree[b--]);
        a /= 2, b /= 2;
    }
    return maxx;
}

void edit(int k, int x){
    k += nr-1;
    tree[k] = x;
    for (k /= 2; k >= 1; k /= 2)
        tree[k] = max(tree[2*k],tree[2*k+1]);
}
int main() {
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin >> n >> m;
    nr = 1 << ((int)log2(n) + 1);
    for (int i = 0; i < n; i++)
        fin >> tree[i+nr];
    for (int i = nr-1; i > 0; i--)
        tree[i] = max(tree[2*i],tree[2*i+1]);
    for (int i = 1; i <= m; i++){
        int v,x,y;
        fin >> v >> x >> y;
        if (!v) fout << maxim(x,y);
        else edit(x,y);
    }
}