Cod sursa(job #2241774)

Utilizator CojocariuAlexandruCojocariu Alexandru CojocariuAlexandru Data 16 septembrie 2018 22:26:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#define NMAX 100005

using namespace std;

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

int ArbMax[NMAX*5];

void Update(int, int, int);
void Query(int, int, int);
int Maxim2(int, int);

int nr, Q, i, POS, VAL, op, x, a, b, maxim, QL, QR;

int main(){
    fscanf(fin, "%d", &nr);
    fscanf(fin, "%d", &Q);
    for(i=1; i<=nr; i++){
        fscanf(fin, "%d", &x);
        POS = i; VAL = x;
        Update(1, 1, nr);
        }
    for(i=1; i<=Q; i++){
        fscanf(fin, "%d", &op);
        fscanf(fin, "%d", &a);
        fscanf(fin, "%d", &b);
        if(op == 1){
            POS = a; VAL = b;
            Update(1, 1, nr);
            }
            else{
                maxim = -1;
                QL = a; QR = b;
                Query(1, 1, nr);
                fprintf(fout, "%d\n", maxim);
                }
        }
    fclose(fin);
    fclose(fout);
    return 0;
}

void Update(int nod, int L, int R){
    int mid = (L+R)/2;
    if(L == R){
        ArbMax[nod] = VAL;
        return;
        }
    if(POS <= mid)
        Update(2*nod, L, mid);
        else
        Update(2*nod+1, mid+1, R);
    ArbMax[nod] = Maxim2(ArbMax[2*nod], ArbMax[2*nod+1]);
}

void Query(int nod, int left, int right){
    int mid = (left+right)/2;
    if(QL<=left && QR >=right){
        if(maxim < ArbMax[nod]) maxim = ArbMax[nod];
        return;
        }
    if(QL <= mid) Query(nod*2, left, mid);
    if(mid < QR) Query(nod*2+1, mid+1, right);
}

int Maxim2(int a, int b){
    if(a>b) return a;
    else return b;
}