Cod sursa(job #2177142)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 18 martie 2018 13:01:36
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[200005],n,m,N=1;

void arbint()
{
    int i;
    for(i=N-1;i>0;i--)
    {
        v[i]=max(v[i*2],v[2*i+1]);
    }
}

void update(int poz, int x)
{
    poz=poz+N-1;
    v[poz]=x;
    while(poz>=1)
    {
        poz/=2;
        v[poz]=max(v[poz*2],v[poz*2+1]);
    }
}

int query(int p, int x, int y, int st, int dr)
{
    if(x==st && y==dr)
        return v[p];
    int middle=(st+dr)/2;
    if(x>=middle+1) return query(2*p+1,x,y,middle+1,dr);//st=1; dr=8 mid=4 dar 4 e putere de-al lui 2, deci jumatatea din drapta o sa inceapa de la 4+1=5 adica mid+1
    if(y<=middle) return query(2*p,x,y,st,middle);
    return max(query(2*p,x,middle,st,middle),query(2*p+1,middle+1,y,middle+1,dr));
}

int main()
{
    int i,x,y,op;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    while(N<n)
        N*=2;
    for(i=N;i<N+n;i++)
    {
        fin>>v[i];
    }
    arbint();
    for(i=1;i<=m;i++)
    {
        fin>>op>>x>>y;
        if(op==1) update(x,y);
        else fout<<query(1,x,y,1,N)<<"\n";/*
    for(int j=1;j<N+n;j++)
        cout<<v[j]<<" ";
    cout<<"\n";*/
    }



    fin.close();
    fout.close();
    return 0;
}