Cod sursa(job #2686169)

Utilizator ioana0211Ioana Popa ioana0211 Data 18 decembrie 2020 17:01:01
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, a, b, tip;
int v[100005], rezbuc[320];
int main()
{
    fin>>n>>m;
    int rad=sqrt(n);
    for(int i=0; i<n; i++){
        fin>>v[i];
        if(v[i]>rezbuc[i/rad]) rezbuc[i/rad]=v[i];
    }
    for(int q=1; q<=m; q++)
    {
        fin>>tip>>a>>b;
        a--; b--;
        if(tip==0)
        {
            int Max=0;
            int pozi_rezbuc=a/rad+1, pozf_rezbuc=b/rad-1;
            if(a%rad==0) pozi_rezbuc--;
            if((b+1)%rad==0) pozf_rezbuc++;
            for(int i=pozi_rezbuc; i<=pozf_rezbuc; i++)
                if(rezbuc[i]>Max) Max=rezbuc[i];
            for(int i=a; i<pozi_rezbuc*rad; i++)
                if(v[i]>Max) Max=v[i];
            for(int i=pozf_rezbuc*rad+rad; i<=b; i++)
                if(v[i]>Max) Max=v[i];
            fout<<Max<<"\n";
        }else
        {
            v[a]=b;
            rezbuc[a/rad]=0;
            int limst=a/rad*rad, limdr=a/rad*rad+rad;
            for(int i=limst; i<limdr; i++)
                if(v[i]>rezbuc[a/rad]) rezbuc[a/rad]=v[i];
        }
    }
    return 0;
}