Cod sursa(job #3358233)

Utilizator gratian-stefan.tothToth Gratian-Stefan gratian-stefan.toth Data 15 iunie 2026 17:51:25
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>

#define MAXN 100001

long long arbore[4 * MAXN];
int n,m;
void creare(long long *a,int nod,int l,int r) 
{
    if (l==r) 
    {
        arbore[nod]=a[l];
        return;
    }
    int mid=(l+r)/2;
    creare(a,2*nod,l, mid);
    creare(a,2*nod+1,mid+1,r);
    arbore[nod]=arbore[2*nod]>arbore[2*nod+1]?arbore[2*nod]:arbore[2*nod+1];
}
void update(int nod,int l,int r,int pos,long long val)
{
    if (l == r) 
    {
        arbore[nod]=val;
        return;
    }
    int mid=(l+r)/2;
    if (pos<=mid)
        update(2*nod,l,mid,pos,val);
    else
        update(2*nod+1,mid+1,r,pos,val);
    arbore[nod] = arbore[2*nod]>arbore[2*nod+1]?arbore[2*nod]:arbore[2*nod+1];
}
long long query(int nod,int l,int r,int ql,int qr) 
{
    if (ql<=l && r<=qr) return arbore[nod];
    int mid=(l+r)/2;
    long long res=-1;
    if (ql<=mid) 
    {
        long long left=query(2*nod,l,mid,ql,qr);
        if (left>res) res=left;
    }
    if (qr>mid) 
    {
        long long right=query(2*nod+1,mid+1,r,ql,qr);
        if (right>res) res=right;
    }
    return res;
}

int main() {
    FILE *fin=fopen("arbint.in","r");
    FILE *fout=fopen("arbint.out","w");
    fscanf(fin,"%d %d",&n,&m);
    long long a[MAXN];
    int i;
    for (i=1; i<=n;i++) fscanf(fin,"%lld",&a[i]);
    creare(a,1,1,n);
    while (m--) 
    {
        int tip,x,y;
        fscanf(fin,"%d %d %d",&tip,&x,&y);
        if (tip==0) fprintf(fout,"%lld\n",query(1,1,n,x,y));
        else update(1,1,n,x,(long long)y);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}