Cod sursa(job #2762291)

Utilizator alexandrudumitru7Alexandru Dumitru alexandrudumitru7 Data 6 iulie 2021 12:19:37
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100005],n,m,op,i,j,l,r,dim,st,dr,Max[350];
int g(int p){if(p%dim==0)return p/dim;return p/dim+1;}
void update(int poz,int val)
{
    v[poz]=val;
    int b=g(poz);
    Max[b]=0;
    for(int i=(b-1)*dim+1;i<=b*dim;++i)
        Max[b]=max(Max[b],v[i]);
}
int query(int l,int r)
{
    int g1=g(l),g2=g(r);
    int rez=0;
    if(g1==g2)
    {
        for(int i=l;i<=r;++i);
            rez=max(rez,v[i]);
    }
    else {
        for(int i=g1+1;i<g2;++i)
            rez=max(rez,Max[i]);
        for(int i=l;i<=g1*dim;++i)
            rez=max(rez,v[i]);
        for(int i=(g2-1)*dim+1;i<=r;++i)
            rez=max(rez,v[i]);
    }
    return rez;
}
int main()
{
    fin>>n>>m;
    dim=sqrt(n);
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        Max[g(i)]=max(Max[g(i)],v[i]);
    }
    while(m--)
    {
        fin>>op>>st>>dr;
        if(!op)
            fout<<query(st,dr)<<'\n';
        else update(st,dr);
    }
    return 0;
}