Cod sursa(job #584836)

Utilizator angelicheartMicu Ana angelicheart Data 26 aprilie 2011 19:45:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
using namespace std;

const int N=100001;
int v[3*N],n,val;

ifstream in("arbint.in");
ofstream out("arbint.out");

inline int max (int a,int b)
{
    return a>b ? a : b;
}

inline void nod_update(int &papa,int st,int dr)
{
    papa=max(st,dr);
}

void update(int poz,int st,int dr,int x,int val)
{
    if (st==dr)
    {
        v[poz]=val;
        return;
    }
    int S=poz<<1,D=S+1,m=(st+dr)>>1;
    if (x<=m)
        update(S,st,m,x,val);
    else
        update(D,m+1,dr,x,val);
    nod_update(v[poz],v[S],v[D]);
}

void query(int poz,int st,int dr,int x,int y)
{
    if (x<=st && dr<=y)
    {
        nod_update(val,val,v[poz]);
        return;
    }
    int m=(st+dr)>>1,S=poz<<1,D=S+1;
    if (x<=m)
        query(S,st,m,x,y);
    if (m<y)
        query(D,m+1,dr,x,y);
}

int query(int x,int y)
{
    val=0;
    query(1,1,n,x,y);
    return val;
}

int main()
{
    int m,c,x,y;
    in>>n>>m;
    for (int i=1;i<=n;i++)
    {
        in>>x;
        update(1,1,n,i,x);
    }
    while (m--)
    {
        in>>c>>x>>y;
        if (!c)
            out<<query(x,y)<<"\n";
        else
            update(1,1,n,x,y);
    }
    return 0;
}