Cod sursa(job #1484675)

Utilizator elevenstrArina Raileanu elevenstr Data 11 septembrie 2015 17:19:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
//http://www.infoarena.ro/problema/arbint
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,x,pos,div,t,maxim=-1,l,r,no;
int maxarb[400701];
inline void update (int nod,int st,int dr, int pos, int val)
{   if(st==dr)
    {
        maxarb[nod]=val;
        return;
    }
   int med=(st+dr)/2;
   if(pos<=med)update(2*nod,st,med,pos,val);
   if(pos>med)update(2*nod+1,med+1,dr,pos,val);

    maxarb[nod]=max(maxarb[nod<<1],maxarb[nod<<1|1]);
}
inline int query(int nod,int st,int dr, int a, int b)
{
    if(a<=st&&dr<=b)
    {   return maxarb[nod];
    }
    int ans=0;
    int med=(st+dr)/2;
    if(a<=med)ans=max(ans,query(nod*2,st,med,a,b));
    if(b>med)ans=max(ans,query(nod*2+1,med+1,dr,a,b));
    return ans;
}
int main()
{   int i,j,a,b,al;
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        in>>al;
        x=al;
        pos=i;
        update(1,1,n,pos,x);
    }

   for(j=1;j<=m;j++)
    {  in>>t>>a>>b;
    if(t==0)
        {out<<query(1,1,n,a,b)<<'\n';}
     else {pos=a;x=b;
     update(1,1,n,pos,x);}

    }
    return 0;
}