Cod sursa(job #1222834)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 24 august 2014 15:26:31
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<cstdio>
using namespace std;
int i, a[20005], n, m, x, y, mx, op;
int max(int a, int b){if (a>=b) return a; else return b;}
void update(int poz){
    a[poz]=max(a[poz*2], a[poz*2+1]);
    if (poz>1) update(poz/2);
}
void change(int st, int dr, int poz_real){
    int mij=st+(dr-st)/2;
    if (st==dr) {a[poz_real]=y; update(poz_real/2); return;}
    if (x<=mij) change(st, mij, poz_real*2);
        else change(mij+1, dr, poz_real*2+1);
}
void cauta(int st, int dr, int poz_real){
    int mij=st+(dr-st)/2;
    if ((x<=st)&&(dr<=y)) {if (mx<a[poz_real]) mx=a[poz_real]; return;}
    if (x<=mij) cauta(st, mij, poz_real*2);
    if (mij<y) cauta(mij+1, dr, poz_real*2+1);
}
int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d", &n, &m);
    for (i=1;i<=n;i++) {scanf("%d", &y); x=i; change(1, n, 1);}
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &op, &x, &y);
        if (op==0) {mx=-1; cauta(1, n, 1); printf("%d\n", mx);}
            else change(1, n, 1);
    }
    return 0;
}