Cod sursa(job #1970779)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 19 aprilie 2017 16:29:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;

int n,m,t,a,b;
int v[100010];
int arb[400010];

void update(int st,int dr,int p,int val,int poz)
{
    if(st==dr) { arb[p]=val; return ; }
    int mid=(st+dr)/2;
    if(poz<=mid) update(st,mid,p<<1,val,poz);
            else update(mid+1,dr,(p<<1)+1,val,poz);
    arb[p]=max(arb[2*p],arb[2*p+1]);
}

int querry(int st,int dr,int p)
{
    if(a<=st && b>=dr) return arb[p];
    int maxi=-1,mid=(st+dr)/2;
    if(a<=mid) maxi=max(maxi,querry(st,mid,p<<1));
    if(b>mid) maxi=max(maxi,querry(mid+1,dr,(p<<1)+1));
    return maxi;
}

int main()
{
    int i;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        update(1,n,1,v[i],i);
    }
    for(;m;m--)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(t==1) update(1,n,1,b,a);
        else printf("%d\n",querry(1,n,1));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}