Cod sursa(job #1301941)

Utilizator diana-t95FMI Tudoreanu Diana Elena diana-t95 Data 26 decembrie 2014 15:02:54
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
using namespace std;
#define maxa 200002
int n, a[maxa], v[maxa/2];
int max(int a, int b)
{
    if (a>b) return a;
    return b;
}
void build(int nod, int st, int dr)
{
    if (st==dr) a[nod]=v[st];
        else {
            build(2*nod, st, (st+dr)/2);
            build(2*nod+1, (st+dr)/2+1, dr);
            a[nod]=max(a[2*nod],a[2*nod+1]);
        }
}
void modifica (int nod, int st, int dr, int val, int poz)
{
    if (st==dr) {if (st==poz) a[nod]=val; return;}
    if (st<=poz && dr>=poz) {
    modifica(2*nod, st, (st+dr)/2, val, poz);
    modifica(2*nod+1,(st+dr)/2+1, dr, val, poz);}
    a[nod]=max(a[2*nod],a[2*nod+1]);


}
int query(int nod, int st, int dr, int x, int y)
{
    if (st>y || dr<x) return 0;
    if (x<=st && dr<=y) return a[nod];
    return max(query(2*nod, st, (st+dr)/2, x, y),query(2*nod+1, (st+dr)/2+1, dr, x, y));
}
int main()
{
    int i, m, op, x, y;
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    for (i=1;i<=n;i++) f>>v[i];
    build(1, 1, n);
    for (i=1;i<=m;i++)
    {
        f>>op;
        if (op==1)
        {
            f>>y>>x;
            modifica(1, 1, n, x, y);
        }
        if (op==0)
        {
            f>>x>>y;
            g<<query(1, 1, n, x, y)<<'\n';
        }
    }

}