Cod sursa(job #2403742)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 11 aprilie 2019 20:18:45
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#define MaxN 100001
#define max(a, b) (a>b?a:b)
using namespace std;
class Int{
  private:
    int V[MaxN];
  public:
    int Size;
    int At(int i){
        return V[i];
    }
  private:
    void Redo(int val, int target, int left, int right, int present){
        int mid=(left+right)/2;
        if(left==right) {V[present]=val; return;}
        else if(target<=mid) Redo(val, target, left, mid, 2*present);
        else 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(left<=mid && right<=mid) return Find(left, right, a, mid, 2*present);
        if(left<=mid && right>mid) return max(Find(left, mid, a, mid, 2*present), Find(mid+1, right, mid+1, b, 2*present+1));
        if(left>mid && right>mid) return Find(left, right, mid+1, b, 2*present+1);
        return 0;
    }
  public:
    void Change(int val, int target){
        Redo(val, target, 1, Size, 1);
        return;
    }
    int Get(int left, int right){
        return Find(left, right, 1, Size, 1);
    }
};
Int Arb;
int N, i, M;
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &N, &M);
    Arb.Size=N;
    for(i=1; i<=N; ++i){
        int x;
        scanf("%d", &x);
        Arb.Change(x, i);
    }
    for(i=1; i<=M; ++i){
        int c, a, b;
        scanf("%d%d%d", &c, &a, &b);
        if(c==0) printf("%d\n", Arb.Get(a, b));
        else Arb.Change(b, a);
    }
    return 0;
}