Cod sursa(job #2783314)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 14 octombrie 2021 11:06:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359d
#define ll long long
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?a:b)
#define bmax(a,b)((a>b)?a:b)
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
ll n,m=1,t,a[962145],b[962145][2],i,j,k,x,y,r,l;bool q;
void f(long long i){
if(x<=b[i][1]&&y>=b[i][0]&&i<=k)
    {if(x<=b[i][0]&&y>=b[i][1])
        r=max(r,a[i]);
        else f(i*2),f(i*2+1);}
}
int main()
{
in>>n>>t;
while(m<n)m*=2,++l;
k=m*2-1;
for(i=0;i<n;i++)in>>a[m+i],b[m+i][0]=b[m+i][1]=i+1;
while(i<=k)b[m+i][0]=b[m+i][1]=i+1,i++;
for(i=m-1;i;i--)a[i]=max(a[i*2],a[i*2+1]),b[i][0]=b[i*2][0],b[i][1]=b[i*2+1][1];
//for(i=1;i<=k;i++)cout<<i<<' '<<a[i]<<' '<<b[i][0]<<' '<<b[i][1]<<'\n';
while(t--){
    in>>q>>x>>y;
    if(q==0)
        r=0,f(1),out<<r<<'\n';
        else{
        x=m+x-1;
        a[x]=y;
        while(max(a[x],a[x^1])!=a[x/2]&&x!=1)a[x/2]=max(a[x],a[x^1]),x/=2;
    }
}
//for(i=1;i<=k;i++)cout<<i<<' '<<a[i]<<' '<<b[i][0]<<' '<<b[i][1]<<'\n';
}