Cod sursa(job #2536716)

Utilizator matei123Biciusca Matei matei123 Data 2 februarie 2020 16:01:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX=100005;
int Arbore[4*NMAX], n, m, R;
void build(int nod, int st, int dr)
{   if(st==dr) in>>Arbore[nod];
    else
    {   int mid=(st+dr)/2;
        build(nod*2, st, mid);
        build(nod*2+1, mid+1, dr);
        Arbore[nod]=max(Arbore[2*nod], Arbore[nod*2+1]);
    }
}
void update(int nod, int st, int dr, int x, int y)
{   if(st==dr)
    {   Arbore[nod]=y;
        return;
    }
    int mid=(st+dr)/2;
    if(x<=mid) update(nod*2, st, mid, x, y);
    if(x>mid) update(nod*2+1, mid+1, dr, x, y);
    Arbore[nod]=max(Arbore[2*nod], Arbore[2*nod+1]);
}
int query(int nod, int st, int dr, int x, int y)
{   if(st>=x && y>=dr) R=max(R, Arbore[nod]);
    else
    {   int mid=(st+dr)/2;
        if(x<=mid) query(nod*2, st, mid, x, y);
        if(mid+1<=y) query(nod*2+1, mid+1, dr, x, y);
    }
}
int main()
{   in>>n>>m;
    build(1, 1, n);
    int p, x, y;
    for(int i=1; i<=m; i++)
    {   in>>p>>x>>y;
        if(p==1) update(1, 1, n, x, y);
        else query(1, 1, n, x, y), out<<R<<'\n', R=0;
    }
    return 0;
}