Cod sursa(job #2875523)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 21 martie 2022 19:59:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
//vector n numere
//m query uri de forma a b, la care trb sa afisezi cu max pe intervalul [a b] si queryuri de forma poz val(update);
const int NMAX=100001;
int max1[NMAX],ordinarynumbers[NMAX];
int rad,n;
int findstangainterval(int intervalindex)
{
    return intervalindex*rad;
}
int finddreaptainterval(int intervalindex)
{
    return min((intervalindex+1)*rad-1,n-1);
}
int findintervalindex(int vectorindex)
{
    return vectorindex/rad;
}
int maxforinterval(int left, int right,int v[])
{
    int rez=0;
    for(int poz=left;poz<=right;poz++)
    {
        rez=max(rez,v[poz]);
    }
    return rez;
}
int query(int lf, int rg)
{
    //lf...x....y....rg
    int ans=0;
    int firstinterval=findintervalindex(lf)+1;
    int lastinterval=findintervalindex(rg)-1;
    int lastoflfinterval=finddreaptainterval(findintervalindex(lf));
    int firstofrginterval=findstangainterval(findintervalindex(rg));
    if(lastoflfinterval>=rg)//daca rg si lf sunt in acelasi interval
    {
        return maxforinterval(lf,rg,ordinarynumbers);
    }
    ans=max(ans, maxforinterval(lf,lastoflfinterval,ordinarynumbers));
    ans=max(ans, maxforinterval(firstofrginterval,rg, ordinarynumbers));
    ans=max(ans, maxforinterval(firstinterval,lastinterval,max1));
    return ans;
}
void update(int poz, int newval)
{
    int intervalindex=findintervalindex(poz);
    int st=findstangainterval(intervalindex);
    int dr=finddreaptainterval(intervalindex);
    ordinarynumbers[poz]=newval;
    max1[intervalindex]=maxforinterval(st,dr,ordinarynumbers);
}
int main()
{
    int q;
    cin>>n>>q;
    for(int i=0;i<n;i++)
    {
        cin>>ordinarynumbers[i];
    }
    rad=(int)sqrt(n);
    for(int i=0;i*rad<n;i++)
    {
        int st=findstangainterval(i);
        int dr=finddreaptainterval(i);
        for(int j=st;j<=dr;j++)
        {
            max1[i]=max(max1[i],ordinarynumbers[j]);
        }
    }
    for(int i=1;i<=q;i++)
    {
        int cer;
        cin>>cer;
        if(cer==0)
        {
            int rg,lf;
            cin>>lf>>rg;
            lf--;
            rg--;
            cout<<query(lf,rg)<<'\n';
        }
        else if(cer==1)
        {
            int poz,newval;
            cin>>poz>>newval;
            poz--;
            update(poz,newval);
        }
    }
    return 0;
}