Cod sursa(job #2541719)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 8 februarie 2020 19:21:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int NMAX=1000010;
int n, v[NMAX], q;
int arb[NMAX*10];
struct INTERVAL{
    int st,dr;
}interval[NMAX];
void citire()
{
    fin>>n>>q;
    for (int i=1; i<=n; i++)
        fin>>v[i];
}
void creareArbore(int rad, int st, int dr)
{
    if (st==dr){
        interval[rad].st=st;
        interval[rad].dr=dr;
        arb[rad]=v[st];
    }else{
        interval[rad].st=st;
        interval[rad].dr=dr;
        int mij=(st+dr)/2;
        creareArbore(2*rad,st,mij);
        creareArbore(2*rad+1,mij+1,dr);
        arb[rad]=max(arb[2*rad],arb[2*rad+1]);
    }
}
int query(int rad, int st, int dr)
{
    if (interval[rad].st>dr || interval[rad].dr<st)
        return -1;
    if (interval[rad].st>=st && interval[rad].dr<=dr)
        return arb[rad];
    int mij=(st+dr)/2;
    return max(query(2*rad,st,dr),query(2*rad+1,st,dr));
}
void update(int rad, int x, int val)
{
    if (interval[rad].st==x && interval[rad].dr==x){
        v[x]=val;
        arb[rad]=val;
    }else{
        int mij=(interval[rad].st+interval[rad].dr)/2;
        if (interval[rad].st<=x && x<=mij){
            update(2*rad,x,val);
        }else if (interval[rad].dr>=x && x>mij)
            update(2*rad+1,x,val);
        arb[rad]=max(arb[2*rad],arb[2*rad+1]);
    }
}
void rezolvare()
{
    int c, x, y;
    for (int i=1; i<=q; i++){
        fin>>c>>x>>y;
        if (c==0)
            fout<<query(1,x,y)<<'\n';
        else
            update(1,x,y);
    }
}
int main()
{
    citire();
    creareArbore(1,1,n);
    rezolvare();
}