Cod sursa(job #2552358)

Utilizator sokka1000Ionita Catalin sokka1000 Data 20 februarie 2020 19:41:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 400003;
int n,q,a[N],m,x,y,z,c,getMax(int,int,int);
int main()
{
    f>>n>>q;
    z=1;
    while(z<n)z*=2;
    m=2*z;
    z--;

    for(int i=1;i<=n;i++)
        f>>a[z+i];

    for(int i=z;i>=1;i--)
        a[i]=max(a[2*i],a[2*i+1]);
    int p=1,s=1;



        for(int i=1;i<m;i++)
          {
           if(i==s)
            {
                p*=2;
           s+=p;

            }
          }

    for(;q;q--)
    {
        f>>c>>x>>y;
        if(c==1)
        {
            x+=z;
            a[x]=y;
            for(x/=2;x;x/=2)
                a[x]=max(a[2*x],a[2*x+1]);
        }
        else
            {g<<getMax(1,1,z+1)<<'\n';
            }
    }
    return 0;
}
int getMax(int nod,int X,int Y)
{
    if(x>Y||X>y)
        return 0;
    if(x<=X&&Y<=y)
        {

            return a[nod];

        }
    int M=(X+Y)/2;
    return max(getMax(2*nod,X,M),getMax(2*nod+1,M+1,Y));
}