Cod sursa(job #2401940)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 10 aprilie 2019 11:01:41
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,i,x,op,a,b;
int arbore[200002];
int frunza[100001];
void init(int poz, int val)
{
    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)
{
    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)
{
    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<=2*n;i++)
      //  cout<<arbore[i]<<' ';
    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;
}