Cod sursa(job #2127696)

Utilizator tudor199G Tudor tudor199 Data 10 februarie 2018 22:26:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>

#define nMax 100003

#define MAX(a,b) (a > b ? a : b)

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int v[3 * nMax];

void update(int nod, int st, int dr, int val, int x, int y){
    if(st == dr){
        v[nod] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(x <= mid){
        update(2 * nod, st, mid, val, x, y);
    }
    if(mid < y){
        update(2 * nod + 1, mid + 1, dr, val, x, y);
    }
    v[nod] = MAX(v[2 * nod], v[2 * nod + 1]);
    return;
}

int querry(int nod, int st, int dr, int x, int y){
    if(x <= st && dr <= y){
        return v[nod];
    }
    int m1 = 0, m2 = 0, mid = (st + dr) / 2;
    if(x <= mid){
        m1 = querry(2 * nod, st, mid, x, y);
    }
    if(mid < y){
        m2 = querry(2 * nod + 1, mid + 1, dr, x, y);
    }
    return MAX(m1, m2);
}

int main(){
	int n, m, cerinta, x, y;
	fin>>n>>m;
	for(int i = 1; i <= m; i++){
        fin>>x;
        update(1, 1, n, x, i, i);
	}
	for(int i = 1; i <= m; i++){
        fin>>cerinta>>x>>y;
        if(cerinta == 0){
            fout<<querry(1, 1, n, x, y)<<"\n";
        }
        else{
            update(1, 1, n, y, x, x);
        }
	}
	return 0;
}