Cod sursa(job #2059354)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 noiembrie 2017 21:42:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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;
    for(i=0; i<n; ++i)
         if(Max[i/radical]<v[i])
            Max[i/radical]=v[i];
}
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,inceput=max(i2*radical,a-1);
    for(i=a-1;i<(int)(i1+1)*radical && i<b;++i)
        if(v[i]>Max_querry) Max_querry=v[i];
    for(i=inceput;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;
}