Cod sursa(job #2267099)

Utilizator andy1207Cioltan Andrei andy1207 Data 23 octombrie 2018 11:28:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
#include<algorithm>

const int NMAX=100000;

int aint[4*NMAX+10];
int p,a,b,sol;

void update(int p,int st,int dr)
{
 int mij=(st+dr)/2;
 if(st==dr)
    aint[p]=b;
 else
    {
     if(a<=mij)
        update(2*p,st,mij);
     else
        update(2*p+1,mij+1,dr);
     aint[p]=std::max(aint[2*p],aint[2*p+1]);
    }
}

void query(int p,int st,int dr)
{
 int mij=(st+dr)/2;
 if(a<=st && dr<=b)
    sol=std::max(sol,aint[p]);
 else
    {
     if(a<=mij)
        query(2*p,st,mij);
     if(mij<b)
        query(2*p+1,mij+1,dr);
    }
}

int main()
{
 freopen("arbint.in","r",stdin);
 freopen("arbint.out","w",stdout);
 int n,m;
 scanf("%d %d ",&n,&m);
 for(int i=1;i<=n;i++)
    {
     int x;
     scanf("%d ",&x);
     b=x;
     a=i;
     update(1,1,n);
    }
 for(int i=1;i<=m;i++)
    {
     scanf("%d %d %d ",&p,&a,&b);
     if(p==1)
         update(1,1,n);
     else
        {
         sol=0;
         query(1,1,n);
         printf("%d\n",sol);
        }
    }
return 0;
}