Cod sursa(job #1155758)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 27 martie 2014 10:17:46
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

using namespace std;

const long nmax=100005;

FILE *f,*g;

long n,m,i,x,y,ind,val,maxim,ic,sf,a[3*nmax];
int cod;

void update(long nod,long st, long dr)
{
    long mij;
    if (st==dr)
    {
        a[nod]=val;
    }
    else
    {
        mij=(st+dr)/2;
        if (ind<=mij) update(2*nod,st,mij);
                else update(2*nod+1,mij+1,dr);
        if (a[2*nod]>=a[2*nod+1]) a[nod]=a[2*nod];
                        else a[nod]=a[2*nod+1];
    }
}

void query(long nod,long st,long dr)
{
    long mij;
   if ((ic<=st)&&(dr<=sf))
   {
       if (a[nod]>maxim) maxim=a[nod];
   }
   else
   {
        mij=(st+dr)/2;
        if (ic<=mij) query(2*nod,st,mij);
        if (mij<sf) query(2*nod+1,mij+1,dr);
   }
}

int main()
{
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    fscanf(f,"%ld%ld",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%ld",&val);
        ind=i;
        update(1,1,n);
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%ld%ld",&cod,&x,&y);
        if (cod==0)
        {
            maxim=0;
            ic=x;sf=y;
            query(1,1,n);
            fprintf(g,"%ld\n",maxim);
        }
        else
        {
            ind=x;val=y;
            update(1,1,n);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}