Cod sursa(job #2068449)

Utilizator vancea.catalincatalin vancea.catalin Data 17 noiembrie 2017 21:51:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<iostream>
#include<fstream>
#define DN 400010
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int N,n,m,pow[DN],A[DN];
void pls()
{
    int i;
    pow[0]=1;
    for(i=1;i<=DN;i++)
    {
        pow[i]=pow[i-1]*2;
        if(n<=pow[i])
        {
            N=pow[i];
            return ;
        }
    }
}
void build()
{
    int i;
    for(i=N-1;i>0;i--) A[i]=max(A[i*2],A[i*2+1]);
}
int querry(int nod,int s,int d,int a,int b)
{
    if(a<=s && d<=b) return A[nod];
    if(d<a || b<s) return -1;
    int f1=2*nod,f2=2*nod+1,m=(s+d)/2;
    return max(querry(f1,s,m,a,b), querry(f2,m+1,d,a,b));
}
void update(int nod,int s,int d,int a,int b)
{
    if(a<s || d<a) return ;
    if(s==d)
    {
        A[nod]=b;
        return ;
    }
    int f1=2*nod,f2=2*nod+1,m=(s+d)/2;
    update(f1,s,m,a,b);
    update(f2,m+1,d,a,b);
    A[nod]=max(A[f1],A[f2]);
}
int main()
{
    int i,op,a,b;
    fin>>n>>m;
    pls();
    for(i=1;i<=n;i++) fin>>A[N+i-1];
    build();

    for(i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==0)
        {
            fout<<querry(1,1,N,a,b)<<"\n";
        }
        else
        {
            update(1,1,N,a,b);
        }
    }
}