Cod sursa(job #1017170)

Utilizator cat_red20Vasile Ioana cat_red20 Data 27 octombrie 2013 13:42:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include<fstream>
#define MAXN 1<<19
using namespace std;
int s[MAXN],sleft[MAXN],sright[MAXN],n,m,x,y,val,p,sol,solR,sum[MAXN];
ifstream fin("maxq.in");
ofstream fout("maxq.out");

void update(int nod,int st,int dr)
{
    if(st==dr && st==p)
    {
        s[nod]=val;
            sleft[nod]=val;
            sright[nod]=val;
            sum[nod]=val;
        return;
    }
    int m=(st+dr)/2;
    if(st<=p && p<=m)
    {
        update(2*nod,st,m);
    }
    else
    if(m<p && p<=dr)
    {
        update(2*nod+1,m+1,dr);
    }
    sum[nod]=sum[2*nod]+sum[2*nod+1];
    sleft[nod]=sleft[2*nod];
    if(sum[2*nod]+sleft[2*nod+1]>sleft[nod])
    {
        sleft[nod]=sleft[2*nod+1]+sum[2*nod];
    }

    sright[nod]=sright[2*nod+1];
    if(sum[2*nod+1]+sright[2*nod]>sright[nod])
    {
        sright[nod]=sum[2*nod+1]+sright[2*nod];
    }
    s[nod]=s[2*nod];
    if(s[nod]<s[2*nod+1])
    {
        s[nod]=s[2*nod+1];
    }
    if(s[nod]<sright[2*nod]+sleft[2*nod+1])
    {
        s[nod]=sright[2*nod]+sleft[2*nod+1];
    }
    if(sum[2*nod]+sum[2*nod+1]>s[nod])
        s[nod]=sum[2*nod]+sum[2*nod+1];
}

void citire()
{
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>val;
        p=i;
        update(1,0,n-1);
    }
}

void querry(int nod,int st,int dr)
{
    if(x<=st && dr<=y)
    {
        if(sol<solR+sleft[nod])
            sol=solR+sleft[nod];
        if(s[nod]>sol)
            sol=s[nod];

        solR+=sum[nod];
        if(sright[nod]>solR)
        solR=sright[nod];
        return;
    }
    int m=(st+dr)/2;
    if(x<=m)
    querry(2*nod,st,m);
    if(m<y)
    querry(2*nod+1,m+1,dr);
}

void getQuerries()
{
    int op,a,b;
    fin>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==0)
        {
            p=a;
            val=b;
            update(1,0,n-1);
        }
        else
        {
            x=a;
            y=b;
            sol=solR=0;
            querry(1,0,n-1);
            fout<<sol<<"\n";
        }
    }
}

int main()
{
    citire();
    getQuerries();
    return 0;
}