Cod sursa(job #1969351)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 18 aprilie 2017 13:49:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f;
ofstream g;
int N,M;
int Arbint[4*100001];
char ibuf[1<<17], obuf[1<<17];

void Update(int node,int left,int right,int pos,int val)
{
    if(left==right)
    {
        Arbint[node]=val;
        return;
    }

    int middle=(left+right)/2;
    if(middle>=pos) Update(2*node,left,middle,pos,val);
    else            Update(2*node+1,middle+1,right,pos,val);
    Arbint[node]=max(Arbint[2*node],Arbint[2*node+1]);
}

int Query(int node, int left, int right, int x, int y)
{
    if(x <= left && right <= y)
        return Arbint[node];

    int middle=(left+right)/2;
    int maxi=-INT_MAX;
    if(x <= middle) maxi=max(maxi,Query(2*node,left,middle,x,y));
    if(y > middle)  maxi=max(maxi,Query(2*node+1,middle+1,right,x,y));

    return maxi;
}

int main()
{
    f.rdbuf()->pubsetbuf(ibuf, 1<<17);
    g.rdbuf()->pubsetbuf(obuf, 1<<17);
    f.open("arbint.in");
    g.open("arbint.out");

    f>>N>>M;
    for(int i=1; i<=N; i++)
    {
        int x;
        f>>x;
        Update(1,1,N,i,x);
    }
    for(int i=1; i<=M; i++)
    {
        int type,x,y;
        f>>type>>x>>y;
        if(type==0) g<<Query(1,1,N,x,y)<<'\n';
        else Update(1,1,N,x,y);
    }
}