Cod sursa(job #2967869)

Utilizator TraianQTraianQ TraianQ Data 20 ianuarie 2023 11:08:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define INF 1000000007
using namespace std;
int v[100005];
const int N=1<<18;
int arbint[N];
ifstream cin("arbint.in");
ofstream cout("arbint.out");
void constructie(int p,int a,int b)
{
    if(a==b)
    {
        cin>>arbint[p];
        return;
    }
    int maxx=(a+b)/2,fs=2*p,fd=2*p+1;
    constructie(fs,a,maxx);
    constructie(fd,maxx+1,b);
    arbint[p]=max(arbint[fs],arbint[fd]);
}
int interogare(int p,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        return arbint[p];
    }
    int m=(st+dr)/2;
    int fs=p*2;
    int fd=p*2+1;
    int rez_st=-INF,rez_dr=-INF;
    if(a<=m)
    {
        rez_st=interogare(fs,st,m,a,b);
    }
    if(m+1<=b)
    {
        rez_dr=interogare(fd,m+1,dr,a,b);
    }
    return max(rez_st,rez_dr);
}
void actualizare(int p,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        arbint[p]=val;
        return;
    }
    int m=(st+dr)/2,fs=2*p,fd=2*p+1;
    if(poz<=m)
    {
        actualizare(fs,st,m,poz,val);
    }
    else
    {
        actualizare(fd,m+1,dr,poz,val);
    }
    arbint[p]=max(arbint[fs],arbint[fd]);
}
int main()
{
    int n,Q,op,a,b;
    cin>>n>>Q;
    constructie(1,1,n);
    for(int i=1;i<=Q;i++)
    {
        cin>>op;
        if(op==0)
        {
            cin>>a>>b;
            cout<<interogare(1,1,n,a,b)<<'\n';
        }
        else
        {
            int poz,val;
            cin>>poz>>val;
            actualizare(1,1,n,poz,val);
        }
    }
    return 0;
}