Cod sursa(job #1812256)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 21 noiembrie 2016 22:19:10
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;
int N,M,v[100005],a[200005],n=1,t;

void update(int p, int x)
{
    int k;
    a[p+n-1]=x;
    p=p+n-1;
    while(k>0)
    {
        if(p%2==1) p--;
        k=p/2;
        a[k]=max(a[p],a[p+1]);
        p=k;
    }
}

int query(int p,int x, int y, int st, int dr)
{
    int m=(st+dr)/2;
    if(st==x && dr==y) {return a[p];}
    if(y<=m) return query(2*p,x,y,st,m);
    if(x>m) return query(2*p+1,x,y,m+1,dr);
    return max( query(2*p,x,m,st,m), query(2*p+1,m+1,y,m+1,dr) );
}


int main()
{
    int i,x,y;
    ifstream fin("arbint.in");
    fin>>N>>M;
    for(i=1;i<=N;i++)
        fin>>v[i];
    while(n<N)
        n*=2;
    for(i=n;i<n+N;i++)
        a[i]=v[i-n+1];
    for(i=n+N+1;i<2*n;i++)
        a[i]=0;
    for(i=n-1;i>0;i--)
        a[i]=max(a[2*i],a[2*i+1]);
    ofstream fout("arbint.out");

    for(i=1;i<=M;i++)
    {
        fin>>t>>x>>y;
        if(t==0)
            fout<<query(1,x,y,1,n)<<"\n";
        else update(x,y);
    }

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