Mai intai trebuie sa te autentifici.

Cod sursa(job #2289167)

Utilizator PaduraruCristianPaduraru Cristian Daniel PaduraruCristian Data 24 noiembrie 2018 11:45:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

#define N 100005
int a[4*N],v[N],n,m,poz;
int start,stop;
void build(int l , int r , int node)
{
    if(l==r)
    {
        a[node]=v[l];
    }
    else
    {
        int mid=(l+r)/2;
        build(l,mid,2*node);
        build(mid+1,r,2*node+1);
        a[node]=max(a[2*node],a[2*node+1]);
    }
}

void update(int l,int r,int node)
{
    if(l==r)
        a[node]=v[l];
    else
    {
        int mid=(l+r)/2;
        if(poz<=mid)
            update(l,mid,2*node);
        else
            update(mid+1,r,2*node+1);
        a[node]=max(a[2*node],a[2*node+1]);
    }
}

int querry(int l,int r,int node)
{
    if(start<=l&&stop>=r)
        return a[node];
    else
    {
        int mid=(l+r)/2;
        int maxl=INT_MIN,maxr=INT_MIN;

        if(start<=mid)
            maxl=querry(l,mid,2*node);
        if(mid+1<=stop) maxr=querry(mid+1,r,2*node+1);
        return max(maxl,maxr);
    }

}


int main()
{
    int q,x,y,i,j;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    build(1,n,1);
    for(i=1;i<=m;i++)
    {
        f>>q>>x>>y;
        if(q==0)
        {
            start=x;stop=y;
            g<<querry(1,n,1)<<"\n";
        }
        else
            {
                v[x]=y;
                poz=x;
                update(1,n,1);
            }
    }
    return 0;
}