Cod sursa(job #3279537)

Utilizator PitigoiOlteanEmanuelPitigoi Oltean Emanuel PitigoiOlteanEmanuel Data 23 februarie 2025 14:01:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <algorithm>
#include <map>
#include <vector>


using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int v[100005],pom[400005];
int n,m;
int rez;

int build(int st,int dr, int poz)
{
 //   cout<<st<<" "<<dr<<" "<<poz<<'\n';
    if(st==dr)
    {
        pom[poz]=v[st];
        return 0;
    }
    int mij=(st+dr)/2;

    build(st,mij , poz*2);
    build(mij+1,dr,poz*2+1);
    pom[poz]=max(pom[poz*2],pom[poz*2+1]);


    return 0;
}

int modif(int pozitie,int st,int dr,int poz,int val)
{
   // cout<<st<<" "<<dr<<"\n";
    if(st==dr)
    {
        pom[poz]=val;
        return 0;
    }
    int mij=(st+dr)/2;
    if(pozitie<=mij)
    {
        modif(pozitie,st,mij,poz*2,val);
    }
    else
    {
        modif(pozitie,mij+1,dr,poz*2+1,val);
    }
    pom[poz]=max(pom[poz*2],pom[poz*2+1]);
    return 0;
}



int query(int st,int dr,int l,int r,int poz)
{
        //cout<<l<<" "<<r<<" "<<poz<<'\n';
    if(l>r)
       {
           return 0;
       }
    if(l==r)
    {
        rez=max(rez,pom[poz]);

        return 0;
    }
    if(st<=l && r<=dr)
    {
        rez=max(rez,pom[poz]);
        return 0;
    }
    int mij=(l+r)/2;
    if(st<=mij)
    {
        query(st,dr,l,mij,poz*2);
    }
    if(mij<dr)
    {
        query(st,dr,mij+1,r,poz*2+1);
    }
    return 0;
}





int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }

    build(1,n,1);
    int cnt=0,ver=1;

    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(a==0)
        {
            rez=-1;
            query(b,c,1,n,1);
            cout<<rez<<'\n';
        }
        else{
            modif(b,1,n,1,c);


        }

    }

    return 0;
}






//manuscrisul voinici