Cod sursa(job #2603596)

Utilizator As932Stanciu Andreea As932 Data 20 aprilie 2020 14:13:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int nmax=100005;

int n,m,sz,k;
int a[nmax],arb[nmax];
int st[nmax],dr[nmax];

void read()
{
    fin>>n>>m;

    for(int i=1;i<=n;i++)
        fin>>a[i];

    sz=0;
    while(sz*sz<=n)sz++;
    sz--;

    k=n/sz+1;

    for(int i=1;i*sz<=n;i++)
    {
        arb[i]=-1;

        st[i]=sz*(i-1)+1;
        dr[i]=sz*i;

        for(int j=st[i];j<=dr[i];j++)
            arb[i]=max(arb[i],a[j]);
    }
}

void answer(int x,int y)
{
    int mx=-1;

    int s=nmax+1,d=-1;

    for(int i=1;i<=k;i++)
        if(x<=st[i] && dr[i]<=y)
        {
            if(st[i]<s)s=st[i];
            if(dr[i]>d)d=dr[i];

            mx=max(mx,arb[i]);
        }
        else if(dr[i]>y)break;

    if(s==nmax+1 && d==-1)s=d=y;

    for(int i=x;i<=s;i++)
        mx=max(mx,a[i]);
    for(int i=d;i<=y;i++)
        mx=max(mx,a[i]);

    fout<<mx<<"\n";
}

void upd(int x,int y)
{
    a[x]=y;

    for(int i=1;i*sz<=n;i++)
        if(x>=sz*(i-1)+1 && x<=sz*i)
        {
            arb[i]=-1;

            for(int j=sz*(i-1)+1;j<=sz*i;j++)
                arb[i]=max(arb[i],a[j]);

            break;
        }
}

void solve()
{
    for(int i=1;i<=m;i++)
    {
        int op,x,y;
        fin>>op>>x>>y;

        if(!op)answer(x,y);
        else upd(x,y);
    }
}

int main()
{
    read();
    solve();

    return 0;
}