Cod sursa(job #356007)

Utilizator floringh06Florin Ghesu floringh06 Data 12 octombrie 2009 23:22:32
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "arbint.in"
#define FOUT "arbint.out"
#define MAX_N 100000

int Arb[MAX_N << 2];

int V[MAX_N];
int N, M, enew, pos, A, B;

    void buildarb (int nod, int l, int r)
    {
         if (l == r) Arb[nod] = V[l];
         else 
              {
                  int m = (l + r) >> 1;
                  
                  buildarb (nod << 1, l, m);
                  buildarb ((nod << 1)|1, m + 1, r);
                  
                  if (Arb[nod << 1] > Arb[(nod << 1)|1]) Arb[nod] = Arb[nod << 1];
                                                    else Arb[nod] = Arb[(nod << 1)|1];
              }
    }
    
    void update (int nod, int l, int r)
    {
         if (l == r) {
               Arb[nod] = enew;
               return;
         }
         
         int m = (l + r) >> 1;
         
         if (pos <= m) update (nod << 1, l, m);
                  else update ((nod << 1)|1, m + 1, r);
                  
         if (Arb[nod << 1] > Arb[(nod << 1)|1]) Arb[nod] = Arb[nod << 1];
                                           else Arb[nod] = Arb[(nod << 1)|1];
         
    }
    
    int query (int nod, int l, int r)
    {
        if (A <= l && r <= B) return Arb[nod];
        
        if (r < A || B < l) return -1;
        
        int m = (l + r) >> 1;
        int ml = query (nod << 1, l, m);
        int mr = query ((nod << 1)|1, m + 1, r);
        
        if (ml > mr) return ml; else return mr;
    }

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d %d", &N, &M);
        int i;
        
        for (i = 1; i <= N; ++i) scanf ("%d", V + i);
        
        buildarb (1, 1, N);
        
        for (i = 1; i <= M; ++i)
        {
            int t;
            scanf ("%d", &t);
            
            if (!t) {
                    scanf ("%d %d", &A, &B);
                    int ret = query (1, 1, N);
                    printf ("%d\n", ret);
            }
            else 
            {
                 scanf ("%d %d", &pos, &enew);
                 update (1, 1, N);
            }
        }
        
        return 0;
    }