Cod sursa(job #1146276)

Utilizator span7aRazvan span7a Data 18 martie 2014 20:43:36
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<algorithm>
using namespace std;
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
int a[10000],n,m;
void update(int i,int left,int right,int x,int poz)
{
    if(left!=right)
    {
        int m=(left+right)/2;
        update(2*i,left,m,x,poz);
        update(2*i+1,m+1,right,x,poz);
       //if(a[2*i]&&a[2*i+1])
            a[i]=max(a[2*i],a[2*i+1]);

    }
    else
        if(left==poz)
            a[i]=x;

}
int maxim(int i,int left,int right,int l,int r)
{
    if(left!=right)
    {
        if(left==l&&right==r)return a[i];
        else
        {
        int m=(left+right)/2;
          if(r<=m)
                return maxim(2*i,left,m,l,r);
            else
                if(l>m)
                    return maxim(2*i+1,m+1,right,l,r);
                    else
                        return max(maxim(2*i,left,m,l,r),maxim(2*i+1,m+1,right,l,r));

        }
    }
    else return a[i];
}
int main()
{
    int i,x,y,cer;
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        update(1,1,n,x,i);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&cer,&x,&y);
        if(cer==1)
            update(1,1,n,y,x);
        else fprintf(g,"%d\n",maxim(1,1,n,x,y));
    }
    /*for(i=1;i<=n;i++)
        g<<a[i]<<" ";*/
    return 0;
}