Cod sursa(job #2321811)

Utilizator rares1012Rares Cautis rares1012 Data 16 ianuarie 2019 17:40:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

int aint[400001];

int mx(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

void insrt(int val,int nod,int st,int dr,int poz)
{
    if(st==dr)
    {
        aint[poz]=val;
    }
    else
    {
        int med=(st+dr)/2;
        if(nod<=med)
        {
            insrt(val,nod,st,med,poz*2);
        }
        else
        {
            insrt(val,nod,med+1,dr,poz*2+1);
        }
        aint[poz]=mx(aint[poz*2],aint[poz*2+1]);
    }
}

int best;

void get(int a,int b,int st,int dr,int poz)
{
    if(st>=a && dr<=b)
    {
        best=mx(best,aint[poz]);
    }
    else
    {
        int med=(st+dr)/2;
        if(!(b<st || a>med))
        {
            get(a,b,st,med,poz*2);
        }
        if(!(b<med+1 || a>dr))
        {
            get(a,b,med+1,dr,poz*2+1);
        }
    }
}

int main()
{
    int n,q,i,k,r,a,b;
    FILE*fi,*fo;
    fi=fopen("arbint.in","r");
    fo=fopen("arbint.out","w");
    fscanf(fi,"%d%d",&n,&q);
    for(i=0; i<n; i++)
    {
        fscanf(fi,"%d",&k);
        insrt(k,i,0,n-1,1);
    }
    for(i=0; i<q; i++)
    {
        fscanf(fi,"%d%d%d",&r,&a,&b);
        a--;
        if(r==1)
        {
            insrt(b,a,0,n-1,1);
        }
        if(r==0)
        {
            b--;
            best=0;
            get(a,b,0,n-1,1);
            fprintf(fo,"%d\n",best);
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}