Cod sursa(job #2333792)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 1 februarie 2019 22:45:01
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N=(int)1e5+7;

int t[3*N];

void upd(int nod,int l,int r,int i,int x)
{
        if(l==r)
        {
                t[nod]=x;
        }
        else
        {
                int m=(l+r)>>1;
                if(i<=m)
                {
                        upd(2*nod+1,l,m,i,x);
                }
                else
                {
                        upd(2*nod+2,m+1,r,i,x);
                }
                t[nod]=max(t[2*nod+1],t[2*nod+2]);
        }
}

int ask(int nod,int l,int r,int a,int b)
{
        if(a<=l && r<=b)
        {
                return t[nod];
        }
        else
        {
                int m=(l+r)>>1;
                int res=0;
                if(a<=m)
                {
                        res=max(res,ask(2*nod+1,l,m,a,b));
                }
                if(b>=m+1)
                {
                        res=max(res,ask(2*nod+2,m+1,r,a,b));
                }
                return res;
        }
}

int main()
{
        freopen("arbint.in","r",stdin);
        freopen("arbint.out","w",stdout);
        int n,q;
        cin>>n>>q;
        for(int i=1;i<=n;i++)
        {
                int x;
                cin>>x;
                upd(1,1,n,i,x);
        }
        while(q--)
        {
                int t,a,b;
                cin>>t>>a>>b;
                if(t==0)
                {
                        cout<<ask(1,1,n,a,b)<<"\n";
                }
                else
                {
                        upd(1,1,n,a,b);
                }
        }
        return 0;
}