Cod sursa(job #998260)

Utilizator emiemiEmi Necula emiemi Data 16 septembrie 2013 17:16:29
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<cstdio>
using namespace std;
FILE *f;
ofstream g("arbint.out");
int m,n,p,i,x,y,arb[400000],a[100001];
int maxim(int a,int b)
{
    if(a>b)
    return a;
    return b;
}
void constr(int nod,int li,int ls)
{
    if(li==ls)
    {
        arb[nod]=a[li];
        return;
    }
    int mij=(li+ls)>>1;
    constr(nod*2,li,mij);
    constr(nod*2+1,mij+1,ls);
    arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}
void insereaza(int nod,int li,int ls,int poz,int val)
{
    if(li==ls)
    {
        arb[nod]=val;
        return;
    }
    int mij=(li+ls)>>1;
    if(poz<=mij)
    insereaza(nod<<1,li,mij,poz,val);
    else
    insereaza((nod<<1)+1,mij+1,ls,poz,val);
    arb[nod]=maxim(arb[nod<<1],arb[(nod<<1)+1]);
}
int query(int nod,int li,int ls,int st,int dr)
{
    if(st<=li&&ls<=dr)
    return arb[nod];
    int mij=(li+ls)/2,x=0;
    if(st<=mij)
    x=query(nod<<1,li,mij,st,dr);
    if(mij<dr)
    x=maxim(x,query((nod<<1)+1,mij+1,ls,st,dr));
    return x;
}
int main()
{
    f=fopen("arbint.in","r");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        fscanf(f,"%d",&a[i]);
        constr(1,1,n);
    }
    for(i=1;i<=m;++i)
    {
        fscanf(f,"%d%d%d",&p,&x,&y);
        if(p==1)
        insereaza(1,1,n,x,y);
        else
        g<<query(1,1,n,x,y)<<'\n';
    }
    return 0;
}