Cod sursa(job #1397122)

Utilizator iarbaCrestez Paul iarba Data 23 martie 2015 11:53:35
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
using namespace std;
int a[200001],i,n,m,poz,val,x,y,caz;
int maxim(int x, int y){if(x>y) return x;return y;}
void update(int left, int right, int nod)
{
    if(left==right){a[nod]=val;return;}
    int piv=(left+right)/2;
    if(poz<=piv){update(left,piv,nod*2);}
    else{update(piv+1,right,nod*2+1);}
    a[nod]=maxim(a[2*nod],a[2*nod+1]);
}
int query(int left, int right, int nod)
{
    if((x<=left)&&(right<=y)){return a[nod];}
    int piv=(left+right)/2;
    int q1=0,q2=0;
    if(x<=piv){q1=query(left,piv,nod*2);}
    if(piv<y){q2=query(piv+1,right,nod*2+1);}
    return maxim(q1,q2);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){scanf("%d",&val);poz=i;update(1,n,1);}
    while(m--)
    {
        scanf("%d",&caz);
        if(caz==0)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",query(1,n,1));
        }
        if(caz==1)
        {
            scanf("%d%d",&poz,&val);
            update(1,n,1);
        }
    }
return 0;
}