Cod sursa(job #356011)

Utilizator floringh06Florin Ghesu floringh06 Data 12 octombrie 2009 23:28:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>
#include <cstring>
 
using namespace std;

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

int A[MAX_N << 1];
int C[MAX_N];
char S[MAX_N * 10];
 
int N, M, x, y;
 
    inline int MAX (int a, int b)
    {
           if (a > b) return a; else return b;
    }
 
    void buildarb (int nod, int li, int lf)
    {
         if (li == lf) A[nod] = C[li];
            else
            {
               int m = (li + lf) >> 1;
                buildarb (nod << 1, li, m);
               buildarb ((nod << 1)|1, m + 1, lf);
                 
                A[nod] = MAX (A[nod << 1], A[(nod << 1)|1]);
           }
    }
     
    int query (int nod, int li, int lf)
    {
        if (x <= li && lf <= y) return A[nod];
        if (y < li || lf < x) return -1;
         
        int m = (li + lf) >> 1;
       return MAX (query (nod << 1, li, m), query ((nod << 1)|1, m + 1, lf));
    }
     
    void update (int nod, int li, int lf)
    {
         if (li == lf)
         {
                A[nod] = y;
                return;
         }
          
         int m = (li + lf) >> 1;
         if (x <= m) update (nod << 1, li, m);
                else update ((nod << 1)|1, m + 1, lf);
                 
         A[nod] = MAX (A[nod << 1], A[(nod << 1)|1]);
    }

  int main ()
   {
        int i, e = 0, L, k = 0;
       freopen (FIN, "r", stdin);
       freopen (FOUT, "w", stdout);
        
       scanf ("%d %d\n", &N, &M);
        gets (S);
        L = strlen (S);
       for (i = 0; i < L; ++i)
            if (S[i] == ' ') C[++k] = e, e = 0;
               else e = e * 10 + (S[i] - '0');
        S[++k] = e;
        buildarb (1, 1, N);
       while (M--)
        {
              int tp;
             scanf ("%d %d %d", &tp, &x, &y);
              if (!tp)
                 printf ("%d\n", query (1, 1, N));
              else update (1, 1, N);
        }
         
        return 0;
    }