Cod sursa(job #1077306)

Utilizator pintilie.andreiPintilie pintilie.andrei Data 11 ianuarie 2014 10:47:55
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define NMAX 100000

using namespace std;

FILE *fin,*fout;

void update(int,int,int,int,int);
int maxim(int,int);
void query(int,int,int,int,int);

int n,m,v[3*NMAX];
int caz,mij;
int maxi,start,finish;

int main()
{
    int i,x,a,b;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&x);
        update(1,i,x,1,n);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d%d%d",&caz,&a,&b);
        if(caz==0)
        {
            maxi = -1;
            start = a, finish = b;
            query(1,a,b,1,n);

            fprintf(fout,"%d\n", maxi);
        }
        else // caz=1;
        {
            update(1,a,b,1,n);
        }
    }
    return 0;
}

int maxim(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

void update(int nod,int pos,int val,int st,int dr)
{
    if(st==dr)
    {
        v[nod]=val;
    }
    else
    {
        mij=(st+dr)/2;
        if(pos<=mij) update(2*nod,pos,val,st,mij);
        else update(2*nod+1,pos,val,mij+1,dr);

        v[nod]=maxim(v[2*nod],v[2*nod+1]);
    }
}

void query(int nod,int start, int finish, int left, int right)
{
     if ( start <= left && right <= finish )
     {
          if ( maxi <v[nod] ) maxi = v[nod];
          return;
     }

     int div = (left+right)/2;
     if ( start <= div ) query(2*nod,start,finish,left,div);
     if ( div < finish ) query(2*nod+1,start,finish,div+1,right);
}