Cod sursa(job #1462253)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 17 iulie 2015 15:17:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *fin = fopen("arbint.in","r");
FILE *fout = fopen("arbint.out","w");

int N, M, X, A, B;
int MyArb[450000];
int in, sf, val, pos, mx;

void Update(int nod, int st, int dr);
void Query(int nod, int st, int dr);

int main() {
    fscanf(fin, "%d %d\n", &N, &M);

    for (int i = 1; i <= N; ++i) {
        fscanf(fin, "%d", &X);
        pos = i, val = X;
        Update(1,1,N);
    }

    for ( int i = 1; i <= M; i++ )
    {
        fscanf(fin, "%d%d%d", &X, &A, &B);
        if ( X == 0 )
        {
             mx = -1;
             in = A, sf = B;
             Query(1,1,N);

             fprintf(fout,"%d\n", mx);
        }
        else
        {
            pos = A, val = B;
            Update(1,1,N);
        }
    }
}

void Update(int nod, int st, int dr) {
     if(st == dr) {
        MyArb[nod] = val;
        return;
     }

     int mij = (st + dr) / 2;
     if(pos <= mij) Update(2 * nod, st, mij);
     else Update(2 * nod + 1, mij + 1, dr);

     MyArb[nod] = max(MyArb[2 * nod], MyArb[2 * nod + 1] );
}

void Query(int nod, int st, int dr) {
     if(in <= st && dr <= sf) {
          if(mx < MyArb[nod]) mx = MyArb[nod];
          return;
     }

     int mij = (st + dr) / 2;
     if(in <= mij) Query(2 * nod, st, mij);
     if(mij < sf) Query(2 * nod + 1, mij + 1, dr);
}