Cod sursa(job #825137)

Utilizator lehman97Dimulescu David lehman97 Data 27 noiembrie 2012 16:34:30
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <stdio.h>

using namespace std;

FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");

int a,b,x,mn=2000000000,mx=0,v[100000],i,n,m,s,sf,val,pos,maxim;
int mxm (int a ,int b)
{
    if(a>b) return a; else return b;
}


void query(int nod, int l, int r)
{
if ( s <= l && r <= sf )
{
if ( maxim < v[nod] ) maxim = v[nod];
return;
}
int m = (l+r)/2;
if ( s <= m ) query(2*nod,l,m);
if ( m < sf ) query(2*nod+1,m+1,r);
}


void update(int nod, int l,int r)
{
    int m=(l+r)/2;
    if(l==r) {v[nod]=val;return;}
    else
    {
      if (pos<=m) update(2*nod,l,m);else update(2*nod+1,m+1,r);
    }
    v[nod] =mxm(v[2*nod],v[2*nod+1]);
}



int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
      fscanf(f,"%d",&x);
      val=x;
      pos=i;
      update(1,1,n);
    }

    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&x,&a,&b);
        if(x==1)
        {
            pos=a;
            val=b;
            update(1,1,n);
        } else
        {
        maxim = -1;
        s=a,sf=b;
        query(1,1,n);
        fprintf(g,"%d\n", maxim);
        }

    }
    fclose(g);
    return 0;
}