Cod sursa(job #612574)

Utilizator dante_devilPiyush Gaurav dante_devil Data 8 septembrie 2011 20:36:43
Problema Arbori de intervale Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 3.25 kb
/*
ID:piyushp1
LANG:C
TASK:segment tree again
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int loga(int n);
int power(int n);
void maketree(int *a,int size,int low,int high,int index);
void update(int *a,int size,int low,int high,int index,int des);
int query(int *a,int size,int low,int high,int index,int A,int B);
int *b;
int main()
{
    FILE *fin,*fout;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    int i,j,k,m,n;
    fscanf(fin,"%d%d",&m,&n);
    b=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
    fscanf(fin,"%d",&b[i]);
    i=loga(n);
    //printf("%d\n",i);
    i++;i++;
    int size=power(i);
    int *a=(int*)malloc(sizeof(int)*size);
    for(i=0;i<size;i++)
    a[i]=-1;
    maketree(a,size,0,n-1,0);
    int **op=(int**)malloc(sizeof(int)*m);
    int *ans=(int*)malloc(sizeof(int)*m);
    k=0;
    for(i=0;i<m;i++)
    op[i]=(int*)malloc(sizeof(int)*3);
    for(i=0;i<m;i++)
    {
        fscanf(fin,"%d%d%d",&op[i][0],&op[i][1],&op[i][2]);
        if(op[i][0]==0)
        {
            op[i][1]--;op[i][2]--;
            ans[k++]=b[query(a,size,0,n-1,0,op[i][1],op[i][2])];

        }
        if(op[i][0]==1)
        {
            op[i][1]--;
            b[op[i][1]]=op[i][2];
            update(a,size,0,n-1,0,op[i][1]);
        }


    }
    for(i=0;i<k;i++)
    fprintf(fout,"%d\n",ans[i]);

    return(0);
}
// a,b are intervals to query upon

int query(int *a,int size,int low,int high,int index,int A,int B)
{
    int i,j;
    if(low==high)
    return(a[index]);
    else
    {
        if(A>high)
        return(-1);
        if(A<low)
        return(-1);
        if(A>(low+high)/2 && B<=high)
        return(query(a,size,(low+high)/2+1,high,2*index+2,A,B));
        if(A>=low && B<=(low+high)/2)
        return(query(a,size,low,(low+high)/2,2*index+1,A,B));
        if(A<=(low+high)/2 && B>(low+high)/2 )
        {
            i=query(a,size,low,(low+high)/2,2*index+1,A,(low+high)/2);
            j=query(a,size,(low+high)/2+1,high,2*index+2,(low+high)/2+1,B);
            if(b[i]>b[j])
            return(i);
            else
            return(j);
        }
    }
}
void maketree(int *a,int size,int low,int high,int index)
{
    if(high==low)
    {
        a[index]=low;
        return;
    }
    else
    {
        maketree(a,size,low,(low+high)/2,2*index+1);
        maketree(a,size,(low+high)/2+1,high,2*index+2);
        if(b[a[2*index+1]]>b[a[2*index+2]])
        a[index]=a[2*index+1];
        else
        a[index]=a[2*index+2];
    }
}
void update(int *a,int size,int low,int high,int index,int des)
{
    if(low==high)
    return;
    else
    {
        if(des>(low+high)/2)
        update(a,size,(low+high)/2+1,high,2*index+2,des);
        else
        update(a,size,low,(low+high)/2,2*index+1,des);
        if(b[a[2*index+1]]>b[a[2*index+2]])
        a[index]=a[2*index+1];
        else
        a[index]=a[2*index+2];
    }
}
int power(int n)
{
    int i;
    if(n==0)
    return(1);
    if(n==1)
    return(2);
    i=power(n/2);
    if(n%2==0)
    return(i*i);
    else
    return(i*i*2);
}
int loga(int n)
{

    int i;
    i=0;
    while(n>1)
    {
        n=n/2;
        i++;
    }
    return(i);
}