Cod sursa(job #3257647)

Utilizator cris71Vlad Bogdan Cristian cris71 Data 18 noiembrie 2024 18:37:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int const lmax=100007*4;
int const minf=0x3f3f3f3f*(-1);
int v[lmax],n,q;
int a,b,c;

void update(int st, int dr, int nod, int val, int pos)
{
    //cout<<st<<" "<<dr<<" "<<nod<<"\n";
    if(st==dr)
    {
        v[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(pos<=mij)
    {
        update(st,mij,nod*2,val,pos);
        v[nod]=max(v[2*nod],v[2*nod+1]);
        //return ;
    }
    else
    {
        update(mij+1,dr,nod*2+1,val,pos);
        v[nod]=max(v[2*nod],v[2*nod+1]);
        //return ;
    }
}
int querry(int st, int dr,int nod, int st_i, int dr_i)///st_i=st interval
{
    if(st>=st_i and dr<=dr_i)
    {
        return v[nod];
    }
    int mij=(st+dr)/2;
    int val=minf;
    if(st_i<=mij)
    {
        val=max(val,querry(st,mij,nod*2,st_i,dr_i));
    }
    if(dr_i>mij)
    {
        val=max(val,querry(mij+1,dr,nod*2+1,st_i,dr_i));
    }
    return val;
}
int main()
{
    fin>>n>>q;
    for(int i=0;i<lmax;i++)
    {
        v[i]=minf;
    }
    for(int i=0;i<n;i++)
    {
        int x;
        fin>>x;
        update(0,n-1,1,x,i);
    }
    for(int i=0;i<q;i++)
    {
        fin>>a>>b>>c;
        if(a==0)
        {
            b--;c--;
            fout<<querry(0,n-1,1,b,c)<<"\n";
        }
        if(a==1)
        {
            b--;
            update(0,n-1,1,c,b);
        }
    }

    fin.close();
    fout.close();
    return 0;
}