Cod sursa(job #1779891)

Utilizator doruliqueDoru MODRISAN dorulique Data 15 octombrie 2016 17:55:21
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#define max(a,b) a>b?a:b
int a[300000];

void update(int nod,int li,int lf,int &ind,int &val)
{
    if(li==lf)
        a[nod]=val;
    else
    {
        int m=(li+lf)/2;
        if(ind<=m)update(2*nod,li,m,ind,val);
        else update(2*nod+1,m+1,lf,ind,val);
        a[nod]=max(a[2*nod],a[2*nod+1]);
    }
}

int vmax(int nod,int li,int lf,int &s,int &d)
{
    if(d<li||s>lf)return 0;
    if(s<=li&&lf<=d)return a[nod];
    int m=(li+lf)/2;
    return max(vmax(2*nod,li,m,s,d),vmax(2*nod+1,m+1,lf,s,d));
}

int main()
{
    FILE *f=fopen("arbint.in","r");
    int n,m,i,x;
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        update(1,1,n,i,x);
    }
    int op,ind,val;
    FILE *g=fopen("arbint.out","w");
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&op,&ind,&val);
        if(op==1)update(1,1,n,ind,val);
        else
            fprintf(g,"%d\n",vmax(1,1,n,ind,val));
    }
    return 0;
}