Cod sursa(job #1921250)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 10 martie 2017 11:53:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <cstdio>
#define inf 1e9

using namespace std;

ofstream g("arbint.out");

struct NODE{
    int val;
    NODE *left,*right;
    NODE(int _val,NODE *_left,NODE *_right) : val(_val) , left(_left) , right(_right){};
};

NODE *Aint;
int N=1,n,m,x,y,t;

void update(NODE *r,int L,int R,int nod,int val)
{
    if (L==R)
    {
        r->val = val;
        return;
    }

    int mid = (L+R)/2;

    if (r->left == NULL)
    {
        r->left = new NODE(-inf,NULL,NULL);
        r->right = new NODE(-inf,NULL,NULL);
    }

    if (nod<=mid)
        update(r->left,L,mid,nod,val);
    else
        update(r->right,mid+1,R,nod,val);
    r->val = max(r->left->val,r->right->val);
}

int query(NODE *r,int L,int R,int st,int dr)
{
    if (st<=L && R<=dr)
        return r->val;

    int mid = (L+R)/2;
    int a = -inf,b = -inf;

    if (r->left == NULL)
    {
        r->left = new NODE(-inf,NULL,NULL);
        r->right = new NODE(-inf,NULL,NULL);
    }

    if (st<=mid && dr>=L)
        a = query(r->left,L,mid,st,dr);
    if (dr>=mid && st<=R)
        b = query(r->right,mid+1,R,st,dr);
    return max(a,b);
}

int main()
{
    freopen("arbint.in","r",stdin);

    scanf("%d%d",&n,&m);

    Aint = new NODE(-inf,NULL,NULL);

    while (N<n)
        N<<=1;

    for (int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(Aint,1,N,i,x);
    }

    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&x,&y);
        if (t==1)
            update(Aint,1,N,x,y);
        else
            g<<query(Aint,1,N,x,y)<<'\n';
    }

    return 0;
}