Cod sursa(job #2763319)

Utilizator alexioana_2006Apostolache Alexia alexioana_2006 Data 13 iulie 2021 09:49:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,v[100005],x,a,b,DIM,Max[400];
int gaseste(int i)
{
    return i/DIM+(i%DIM!=0);
}
void update(int pos, int val)
{ v[pos]=val;
int grupa=gaseste(pos);
Max[grupa]=0;
for(int i=(grupa-1)*DIM+1;i<=grupa*DIM;i++)
    Max[grupa]=max(Max[grupa],v[i]);
}
int query(int l, int r)
{  int rasp=0;
   int grupast=gaseste(l);
   int grupadr=gaseste(r);
 if(grupadr==grupast)
    {
        for(int i=l;i<=r;i++)
            rasp=max(rasp,v[i]);
        return rasp;
    }

    for(int i=gaseste(l)+1;i<=gaseste(r)-1;i++)
        rasp=max(rasp,Max[i]);
    for(int i=l;i<=gaseste(l)*DIM;i++)
        rasp=max(rasp,v[i]);
    for(int i=(gaseste(r)-1)*DIM+1;i<=r;i++)
        rasp=max(rasp,v[i]);
    return rasp;
}
int main()
{ fin>>n>>m;
DIM=sqrt(n);
for(int i=1;i<=n;i++)
  { fin>>v[i];
    int grupa=gaseste(i);
    Max[grupa]=max(Max[grupa],v[i]);
  }
for(int i=1;i<=m;i++)
{
    fin>>x>>a>>b;
    if(!x)
        fout<<query(a,b)<< '\n';
    else update(a,b);
}

    return 0;
}