Cod sursa(job #2404138)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 12 aprilie 2019 12:37:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
    int V[400007];
    void Redo(int val, int target, int left, int right, int present){
        int mid=(left+right)/2;
        if(left>target || right<target) return;
        if(left==right) {V[present]=val; return;}
        Redo(val, target, left, mid, 2*present);
        Redo(val, target, mid+1, right, 2*present+1);
        V[present]=max(V[2*present], V[2*present+1]);
        return;
    }
    int Find(int left, int right, int a, int b, int present){
        int mid=(a+b)/2;
        if(a==left && b==right) return V[present];
        if(right<=mid) return Find(left, right, a, mid, 2*present);
        else if(left>mid) return Find(left, right, mid+1, b, 2*present+1);
        else return max(Find(left, mid, a, mid, 2*present), Find(mid+1, right, mid+1, b, 2*present+1));
    }
int N, i, M;
int main()
{
    fin>>N>>M;
    for(i=1; i<=N; ++i){
        int x;
        fin>>x;
        Redo(x, i, 1, N, 1);
    }
    for(i=1; i<=M; ++i){
        int c, a, b;
        fin>>c>>a>>b;
        if(c==0) fout<<Find(a, b, 1, N, 1)<<"\n";
        else Redo(b, a, 1, N, 1);
    }
    return 0;
}