Cod sursa(job #1414903)

Utilizator Darius15Darius Pop Darius15 Data 3 aprilie 2015 12:02:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,i,a[100001],c,l,st[100001],dr[100001],j,MAX[100001],t,x,y,ans,sel,sel1;
int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        f>>a[i];
        c=sqrt(n);
    for (i=1;i<=n;i+=c)
    {
        ++l;
        st[l]=i,dr[l]=i+c-1;
        for (j=i;j<=i+c-1;j++)
        if (MAX[l]<a[j])
           MAX[l]=a[j];
    }
    for (i=1;i<=m;i++)
    {
        f>>t>>x>>y;
        if (t==0)
        {
            ans=0;
            sel=0;
            for (j=1;j<=l;j++)
                if (st[j]<=x && x<=dr[j])
                sel=j;
            sel1=0;
            for (j=1;j<=l;j++)
                if (st[j]<=y && y<=dr[j])
                sel1=j;
            for(j=sel+1;j<=sel1-1;j++)
                ans=max(ans,MAX[j]);
           for (j=x;j<=dr[sel];j++)
            ans=max(ans,a[j]);
           for (j=st[sel1];j<=y;j++)
            ans=max(ans,a[j]);
           g<<ans<<'\n';
        }
        else
        {
            for (j=1;j<=l;j++)
                if (st[j]<=x && x<=dr[j])
                sel=j;
            a[x]=y;
            MAX[sel]=a[st[sel]];
            for (j=st[sel];j<=dr[sel];j++)
                MAX[sel]=max(MAX[sel],a[j]);
        }
    }
    return 0;
}