Cod sursa(job #2278171)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 7 noiembrie 2018 13:36:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,a[100005],mx[400],R;
void Actualizare(int x,int y)
{
    int i;
    a[x]=y;
    mx[x/R]=0;
    for(i=R*(x/R); i<R*(x/R+1); i++)
        mx[x/R]=max(mx[x/R],a[i]);
}
int Afisare(int x, int y)
{
    int i,sol=0;
    if(x/R<y/R){
    for(i=x/R+1; i<y/R; i++)
    {
        sol=max(sol,mx[i]);
        // cout<<i<<" ";
    }
    //cout<<"*";
    for(i=x; i<R*(x/R+1); i++)
    {
        sol=max(sol,a[i]);
        //cout<<i<<" ";
    }
    //cout<<"*";
    for(i=R*(y/R); i<=y; i++)
    {
        sol=max(sol,a[i]);
        //cout<<i<<" ";
    }
               }
    else for(i=x; i<=y; i++)
                sol=max(sol,a[i]);
    return sol;
}
int main()
{
    int x,y,i,p;
    fin>>N>>M;
    R=int(sqrt(double(N)));
    //cout<<"{{"<<R<<"}}";
    for(i=1; i<=N; i++)
        fin>>a[i];
    for(i=1; i<=N; i++)
        mx[i/R]=max(mx[i/R],a[i]);
    for(i=1; i<=M; i++)
    {
        fin>>p>>x>>y;
        if(p==1)
            Actualizare(x,y);
        else
            fout<<Afisare(x,y)<<"\n";
    }
}