Cod sursa(job #1768284)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 30 septembrie 2016 17:05:34
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

using namespace std;

int copac[200000], a, b;

int max(int a, int b){
    if(a<b)
        return b;
    return a;
}

void add(int nod, int st, int dr){
    if(st==dr && st==a){
        copac[nod]=b;
        return;
    }
    if(a<=(dr-st)/2+st)
        add(2*nod,st,(dr-st)/2+st);
    else
        add(2*nod+1,(dr-st)/2+st+1,dr);
    copac[nod]=max(copac[2*nod+1],copac[2*nod]);
}

int query(int nod, int st, int dr){
    if(a<=st && dr<=b)
        return copac[nod];
    int rez=0;
    if(a<=(dr-st)/2+st)
        rez=query(2*nod,st,(dr-st)/2+st);
    if(b>=(dr-st)/2+st+1)
        rez=max(rez,query(2*nod+1,(dr-st)/2+st+1,dr));
    return rez;
}

int main()
{
    int n, m, i, c;
    FILE *fi=fopen("arbint.in", "r"), *fo=fopen("arbint.out", "w");
    fscanf(fi, "%d%d", &n, &m);
    for(i=1;i<=n;i++){
        fscanf(fi, "%d", &b);
        a=i;
        add(1,1,n);
    }
    for(i=1;i<=m;i++){
        fscanf(fi, "%d%d%d", &c, &a, &b);
        if(c==0)
            fprintf(fo, "%d\n", query(1,1,n));
        else
            add(1,1,n);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}