Cod sursa(job #3276903)

Utilizator stanciuvalentinStanciu-Tivlea Valentin Gabriel stanciuvalentin Data 15 februarie 2025 09:10:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,q,op,x,y,maxim,v[100200],seg[400200];

void build(int n,int st,int dr)
{
    if(st==dr)
        seg[n]=v[st];
    else
    {
        int mij=(st+dr)/2;
        build(n*2,st,mij);
        build(n*2+1,mij+1,dr);
        seg[n]=max(seg[n*2],seg[n*2+1]);
    }
}

void update(int n,int st,int dr,int p,int x)
{
    if(st==dr)
        seg[n]=x;
    else
    {
        int mij=(st+dr)/2;
        if(p<=mij)
            update(n*2,st,mij,p,x);
        else
            update(n*2+1,mij+1,dr,p,x);
        seg[n]=max(seg[n*2],seg[n*2+1]);
    }
}

void query(int n,int st,int dr,int x,int y)
{
    if(x<=st and dr<=y)
        maxim=max(maxim,seg[n]);
    else
    {
        int mij=(st+dr)/2,a=0,b=0;
        if(x<=mij)
            query(n*2,st,mij,x,y);
        if(y>mij)
            query(n*2+1,mij+1,dr,x,y);
    }
}

int main()
{
    f>>n>>q;
    for(int i=1; i<=n; i++)
        f>>v[i];
    build(1,1,n);
    for(int qq=1; qq<=q; qq++)
    {
        f>>op>>x>>y;
        if(op==1)
            update(1,1,n,x,y);
        else
            maxim=0, query(1,1,n,x,y), g<<maxim<<'\n';
    }
    return 0;
}