Cod sursa(job #2059334)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 noiembrie 2017 21:27:47
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define NRMARE INT_MAX
using namespace std;
vector<int> v;
int n,Max[1000],radical,m,t,a,b;
ifstream f("arbint.in");
ofstream g("arbint.out");
void impartire_siruri()
{
    radical=sqrt(n);
    int i,j;
    for(i=0; i<radical; ++i)
    {
        Max[i]=-1;
        for(j=(int)i*radical; j<(int)(i+1)*radical || j<n; ++j)
            if(Max[i]<v[j]) Max[i]=v[j];
    }
}
int determina_interval(int x)
{
    return x/radical;
}
int query(int a,int b)
{
    int i1=determina_interval(a-1),i2=determina_interval(b-1);
    int Max_querry=0;int i;
    for(i=a-1;i<(int)(i1+1)*radical;++i)
        if(v[i]>Max_querry) Max_querry=v[i];
    for(i=(int)i2*radical;i<b;++i)
        if(v[i]>Max_querry) Max_querry=v[i];
    for(i=i1+1;i<i2;++i)
        if(Max[i]>Max_querry) Max_querry=Max[i];
    return Max_querry;
}
void update(int a,int b)
{
    int interval=determina_interval(a-1);
    v[a-1]=b;
    Max[interval]=0;
    int i;
    for(i=(int)interval*radical;i<(int)(interval+1)*radical;++i)
        if(v[i]>Max[interval]) Max[interval]=v[i];
}
int main()
{
    int i;
    f>>n>>m;
    v.resize(n);
    for(i=0; i<n; ++i)
        f>>v[i];
    impartire_siruri();
    for(i=0;i<m;++i)
        {
            f>>t>>a>>b;
            if(!t) g<<query(a,b)<<'\n';
            else update(a,b);
        }
    return 0;
}