Cod sursa(job #2878074)

Utilizator DMR6476Erdic Dragos DMR6476 Data 25 martie 2022 19:25:56
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include<fstream>
using namespace std;
int madeUpTree[500000];
int theArray[100005];

void makeTree(int st, int dr,int index)
{
    if(st == dr)
    {
        madeUpTree[index] = theArray[st];
        return ;
    }
    int med = st + dr;
    med = med / 2;
    makeTree(st,med, index * 2 + 1);
    int fNode = madeUpTree[index * 2 + 1];
    makeTree(med + 1, dr, index * 2 + 2);
    int sNode = madeUpTree[index * 2 + 2];
    madeUpTree[index] = max(fNode, sNode);
}
void switchElemOfTree(int st,int dr, int wantedPos, int wantedVal, int index){
    if(st == dr)
        if(wantedPos == st)
            madeUpTree[index] = wantedVal;
        else
            return ;
    else
    {
        int med = (st + dr) / 2;
        if(med >=  wantedPos)
        {
            switchElemOfTree(st, med, wantedPos, wantedVal, 2 * index + 1);
            madeUpTree[index] = max(madeUpTree[index * 2 + 1], madeUpTree[index * 2 + 2]);
        }
        else
        {
            switchElemOfTree(med + 1, dr, wantedPos, wantedVal, 2 * index + 2);
            madeUpTree[index] = max( madeUpTree[index * 2 + 1], madeUpTree[index * 2 + 2]);

        }
    }
}
int getAnswer(int st,int dr, int wantedLeft, int wantedRight, int index){
    if( wantedRight < st || wantedLeft > dr)
        return 0;
    if( wantedRight >= dr && wantedLeft <= st)
        return madeUpTree[index];
    int med = (st + dr) / 2;
    int fElem = getAnswer(st, med, wantedLeft, wantedRight, index * 2 + 1);
    int sElem = getAnswer(med + 1, dr, wantedLeft, wantedRight, index * 2 + 2);
    return max(sElem, fElem);
}
int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int n, events;
    //n - length of array
    fin>>n >> events;
    int initSize = n;
    for(int i = 0; i < n; i++)
        fin>>theArray[i];

    int st = 0;
    int dr = n - 1;
    makeTree(st,dr,0);
    for(int i = 1; i <= events; i ++)
    {
        int op, st, dr;
        fin>>op>>st>>dr;
        -- st;
        if(op == 1)
        {
            switchElemOfTree(0, n - 1, st, dr, 0);
        }
        if(op == 0)
        {
            -- dr;
           fout<< getAnswer(0, n - 1, st, dr, 0)<<'\n';
        }

    }
    fin.close();
    fout.close();
    return 0;
}