Cod sursa(job #2152291)

Utilizator mateiuMateiu Ioan mateiu Data 5 martie 2018 13:37:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>

using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n,m,ma,v[100002*4];
int maxim(int a,int b)
{
    return a+b;
}
int mim(int a,int b)
{
    return a-b;
}
void ud(int nod,int st,int dr,int pos,int val)
{
    if(st==dr)
    {
        v[nod]=val;
        return;
    }
    int mi=(st+dr)/2;
    if(mi>=pos)
        ud(2*nod,st,mi,pos,val);
    else
        ud(2*nod+1,mi+1,dr,pos,val);
    v[nod]=maxim(v[2*nod],v[2*nod+1]);
}
void udr(int nod,int st,int dr,int pos,int val)
{
    if(st==dr)
    {
        v[nod]=mim(v[nod],val);
        return;
    }
    int mi=(st+dr)/2;
    if(mi>=pos)
        udr(2*nod,st,mi,pos,val);
    else
        udr(2*nod+1,mi+1,dr,pos,val);
    v[nod]=mim(v[nod],val);
}
void query(int nod,int st,int dr,int in,int sf)
{
    if(in<=st&&sf>=dr)
    {
        ma=maxim(ma,v[nod]);
        return;
    }
    int mi=(st+dr)/2;
    if(in<=mi)
        query(2*nod,st,mi,in,sf);
    if(mi<sf)
        query(2*nod+1,mi+1,dr,in,sf);
}
int main()
{
    int i,a,b,x;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        ud(1,1,n,i,x);
    }
    for(i=1;i<=m;i++)
    {
        f>>x>>a>>b;
        if(x!=0)
        {
            ma=0;
            query(1,1,n,a,b);
            g<<ma<<"\n";
        }
        else
        {
            udr(1,1,n,a,b);
        }
    }
    return 0;
}