Cod sursa(job #1255040)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 4 noiembrie 2014 09:41:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
int m,n,p1,p2,temp;
bool as;
int a[100001],b[200001];
int maxim=0;
int x;
int maximum(int a,int b)
{
    if(a>b) return a;
    return b;
}
void place(int nod,int s,int e)
{
    int mid=(s+e)/2;
    if(s==e) b[nod]=a[x];
    else if(s<=x&&x<=mid)
    {
        place(2*nod,s,mid);
        b[nod]=maximum(b[2*nod],b[2*nod+1]);
    }
    else if(mid+1<=x&&x<=e)
    {
        place(2*nod+1,mid+1,e);
        b[nod]=maximum(b[2*nod],b[2*nod+1]);
    }
}
void gasire(int nod,int s,int e,int p1,int p2)
{
    int mid=(s+e)/2;
    if(s==p1&&p2==e)
    {
        if(maxim<b[nod]) maxim=b[nod];
    }
    else if(p1>=s&&p2<=mid) gasire(2*nod,s,mid,p1,p2);
    else if(p1>=mid+1&&p2<=e) gasire(2*nod+1,mid+1,e,p1,p2);
    else if(p1>=s&&p2>mid)
    {
        gasire(1,1,n,mid+1,p2);
        gasire(2*nod,s,mid,p1,mid);
    }
    else if(p1<=mid+1&&p2<=e)
    {
        gasire(1,1,n,p1,mid);
        gasire(2*nod+1,mid+1,e,p1,p2);
    }
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    fscanf(fin,"%d %d",&n,&m);
    for(x=1;x<=n;x++)
    {
        fscanf(fin,"%d",&a[x]);
        place(1,1,n);
    }
    for(int i=0;i<m;i++)
    {
        fscanf(fin,"%d %d %d",&as,&p1,&p2);
        if(as==0)
        {
            maxim=0;
            gasire(1,1,n,p1,p2);
            fprintf(fout,"%d",maxim);
            fprintf(fout,"\n");
        }
        else if(as==1)
        {
            x=p1;
            temp=a[x];
            a[x]=p2;
            place(1,1,n);
        }
    }
}