Cod sursa(job #1961793)

Utilizator MaligMamaliga cu smantana Malig Data 11 aprilie 2017 12:52:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>

namespace standard = std;
using namespace standard;

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

const int arbMax = (2 * 131072 - 1) + 5;
const int NMax = 1E5 + 5;

namespace arbStuff {
    void update(int,int,int,int,int);
    int query(int,int,int,int,int);
}

int N,M;
int arb[arbMax];

int main() {
    /*
    int pw = 1;
    while (pw < NMax) {
        pw <<= 1;
    }
    out<<pw <<"\n\n\n";
    */

    using arbStuff::query;

    in>>N>>M;

    for (int i=1;i<=N;++i) {
        int val;
        in>>val;
        arbStuff::update(1,1,N,i,val);
    }

    while (M--) {
        int tip,a,b;
        in>>tip>>a>>b;
        if (tip == 0) {
            int val = query(1,1,N,a,b);
            out<<val<<'\n';
        }
        else {
            arbStuff::update(1,1,N,a,b);
        }
    }


    in.close();out.close();
    return EXIT_SUCCESS;
}

void arbStuff::update(int nod,int st,int dr,int poz,int val) {
    if (st == dr) {
        arb[nod] = val;
        return;
    }

    int mij = (st+dr)>>1,
        fSon = (nod<<1),
        sSon = (nod<<1) + 1;
    if (poz <= mij) {
        arbStuff::update(fSon,st,mij,poz,val);
    }
    else {
        arbStuff::update(sSon,mij+1,dr,poz,val);
    }

    arb[nod] = max(arb[fSon],arb[sSon]);
}

int arbStuff::query(int nod,int st,int dr,int a,int b) {
    if (a <= st && dr <= b) {
        return arb[nod];
    }

    int mij = (st+dr)>>1,
        fSon = (nod<<1),
        sSon = (nod<<1) + 1,
        mx = 0;
    if (a <= mij) {
        mx = arbStuff::query(fSon,st,mij,a,b);
    }
    if (mij+1 <= b) {
        mx = max(mx, arbStuff::query(sSon,mij+1,dr,a,b));
    }

    return mx;
}