Cod sursa(job #1267158)

Utilizator andi12Draghici Andrei andi12 Data 19 noiembrie 2014 16:55:22
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>

using namespace std;
const int N=100001;
int maxa[4*N+66];
int poz,max,val,start,fin;
int maxim(int x,int y)
{
    if(x>=y)
        return x;
    else
        return y;
}
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        maxa[nod]=val;
        return ;
    }
    else
    {
        int mid=(st+dr)/2;
        if(poz<=mid)
            update(2*nod,st,mid);
        else
            update(2*nod+1,mid+1,dr);
    }
    maxa[nod]=maxim(maxa[2*nod],maxa[2*nod+1]);
}
void ras(int nod,int st,int dr)
{
    if(start<=st && dr<=fin)
    {
        max=maxim(maxa[nod],max);
        return ;
    }
    else
    {
        int mid=(st+dr)/2;
        if(start<=mid)
            ras(2*nod,st,mid);
        if(fin>mid)
            ras(2*nod+1,mid+1,dr);
    }
}
int main()
{
    FILE *in,*out;
    in=fopen("arbint.in","r");
    out=fopen("arbint.out","w");
    int n,m,a,x,b,i;
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&x);
        poz=i;
        val=x;
        update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d%d",&x,&a,&b);
        if(x==1)
        {
            poz=a;
            val=b;
            update(1,1,n);
        }
        if(x==0)
        {
            start=a;
            fin=b;
            max=0;
            ras(1,1,n);
            fprintf(out,"%d\n",max);
        }
    }
    return 0;
}