Cod sursa(job #1142503)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 13 martie 2014 21:34:58
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
//FUCK YOU INFOARENA

#include <cstdio>
#define dmax 1000000010
using namespace std;
int v[400100],maxim;

inline int max(int a, int b)
{
   return a>b?a:b;
}
void update(int nod, int poz, int x, int st, int dr)
{
   if (st==dr) v[nod]=x;
   else {
       int m=st+(dr-st)/2;
       if (poz<=m) update(2*nod,poz,x,st,m);
       else update(2*nod+1,poz,x,m+1,dr);
       v[nod]=max(v[2*nod],v[2*nod+1]);
   }

}
int query(int nod, int st, int dr, int a, int b)
{
   int x=0,y=0;
   if (st>=a && dr<=b) maxim=max(maxim,v[nod]);
   else {
       int m=st+(dr-st)/2;
       if (m>=a) maxim=max(maxim,query(2*nod,st,m,a,b));
       if (m+1<=b) maxim=max(maxim,query(2*nod+1,m+1,dr,a,b));
       return maxim;
   }
}
int main()
{
   int n,m,x,y,z;
   freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);
   scanf("%d%d", &n, &m);

   for (int i=1;i<=n;i++)
   {
       scanf("%d", &x);
       update(1,i,x,1,n);
   }
   for (int i=1;i<=m;i++)
   {
       scanf("%d%d%d", &x, &y, &z);
       if (x==0) {
            maxim=0;
            query(1,1,n,y,z);
            printf("%d\n",maxim);
       }
       if (x==1) update(1,y,z,1,n);
   }
   return 0;
}