Cod sursa(job #2468379)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 5 octombrie 2019 14:56:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,i,x,op,a,b;
int arbore[400002];
int frunza[100001];
void init(int poz, int val)
{
    ///merge de sus in jos
    int pozc, st, dr;
    pozc=1;
    st=1;
    dr=n;
    while(true)
    {
        arbore[pozc]=max(arbore[pozc], val);
        if(st==dr)
        {
            frunza[st]=pozc;
            return;
        }
        if(poz>(st+dr)/2)
        {
            st=(st+dr)/2+1;
            pozc=2*pozc+1;
        }
        else
        {
            dr=(st+dr)/2;
            pozc=2*pozc;
        }
    }
}

int qu(int xt, int yt, int xc, int yc, int poz)
{
    ///x tinta, y tinta, x curent, y curent, poz in vector in momentul de fata
    if(xt==xc && yt==yc)
        return arbore[poz];
    if(yt<=(xc+yc)/2)
        return qu(xt, yt, xc, (xc+yc)/2, 2*poz);
    if(xt>(xc+yc)/2)
        return qu(xt, yt, (xc+yc)/2+1, yc, 2*poz+1);
    return max(qu(xt, (xc+yc)/2, xc, (xc+yc)/2, 2*poz),
               qu((xc+yc)/2+1, yt, (xc+yc)/2+1, yc, 2*poz+1));

}
void upd(int poz, int val)
{
    ///merge de jos in sus
    int pozc=frunza[poz];
    arbore[pozc]=val;
    pozc/=2;
    while(true)
    {
        arbore[pozc]=max(arbore[2*pozc], arbore[2*pozc+1]);
        if(pozc==1)
            break;
        pozc/=2;
    }
}
int main()
{
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        init(i, x);
    }
    for(i=1; i<=m; i++)
    {

        fin>>op>>a>>b;
        if(op==0)
            fout<<qu(a,b, 1, n, 1)<<'\n';
        else
            upd(a, b);
    }
    return 0;

}