Cod sursa(job #2082822)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 6 decembrie 2017 20:05:35
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[100005],b[100005];
int main()
{
    int n,i,j,ok,rad,m,x,y;
    fin>>n>>m;
    rad=sqrt(n);
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
        if(a[i]>b[i/rad]) b[i/rad]=a[i];
    }
    while(m--)
    {
        fin>>ok>>x>>y;

        if(ok==1)
        {
            a[x]=y;
            b[x/rad]=0;
            int x1=(x/rad)*rad;
            int y1=(x/rad)*rad +rad-1;
            for(int j=x1;j<=y1;j++)
            {
                if(a[j]>b[x/rad]) b[x/rad]=a[j];
            }
        }
        else
        {
            int maxi=0;
            for(int j=x/rad+1;j<=y/rad-1;j++)
            {
                if(b[j]>maxi) maxi=b[j];
            }
            if(x/rad != y/rad)
            {
                for(int j=x;j/rad==x/rad;j++)
                {
                    if(a[j]>maxi) maxi=a[j];
                }
                for(int j=y;j/rad==y/rad;j--)
                {
                    if(a[j]>maxi) maxi=a[j];
                }
            }
            else
            {
                for(int j=x;j<=y;j++)
                {
                    if(a[j]>maxi) maxi=a[j];
                }
            }
            fout<<maxi<<"\n";
        }
    }
}