Cod sursa(job #1912705)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 8 martie 2017 10:17:02
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,a[400003],N;

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

void Update(int x, int y)
{
    x=x+N-1;
    a[x]=y;
    while(x>=1)
    {
        x=x/2;
        a[x]=max(a[2*x],a[2*x+1]);
    }
}

int main()
{
    int i,op,x,y;
    ifstream fin("arbint.in");
    fin>>n>>m;
    N=1;
    while(N<n)
        N*=2;
    for(i=N;i<N+n;i++)
        fin>>a[i];
    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>>op>>x>>y;
        if(op==1) Update(x,y);
        else fout<<Query(1,x,y,1,N)<<"\n";
    }
    fout.close();
    fin.close();
    return 0;
}