Cod sursa(job #1858208)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 27 ianuarie 2017 10:20:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
//Nu lua asta ca exemplu!
#include <fstream>
#define Nmax 100001
using namespace std;

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

int n,N,tree[Nmax*4],lazy[Nmax*4],v[Nmax+1];


void UP(int nod, int st, int dr, int L, int R, int val)
{
    if (lazy[nod]!=0)
    {
        tree[nod] += lazy[nod];
        if (nod<N)
        {
            lazy[nod*2] += lazy[nod];
            lazy[nod*2+1] += lazy[nod];
        }
        lazy[nod] = 0;
    }
    if (L<=st && dr<=R)
    {
        tree[nod] += val;
        if (nod<N)
        {
            lazy[nod*2] += val;
            lazy[nod*2+1] += val;
        }
        return;
    }
    else if (R<st || dr<L)
        return;
    int mid = (st+dr)/2;
    int x,y;
    UP(nod*2,st,mid,L,R,val);
    UP(nod*2+1,mid+1,dr,L,R,val);
    tree[nod] = max(tree[nod*2],tree[nod*2+1]);
}

int query(int nod, int st,int dr,int L, int R)
{
    if (lazy[nod]!=0)
    {
        tree[nod] += lazy[nod];
        if (nod<N)
        {
            lazy[nod*2] += lazy[nod];
            lazy[nod*2+1] += lazy[nod];
        }
        lazy[nod] = 0;
    }

    if (L<=st && dr<=R)
        return tree[nod];
    int mid = (st+dr)/2;

    int x = 0;
    if (st<=R && mid>=L)
        x = query(nod*2,st,mid,L,R);
    if (L<=dr && R>mid)
        x = max(x,query(nod*2+1,mid+1,dr,L,R));
    return x;
}

int main()
{
    int q;
    f>>n>>q;

    N = 1;
    while (N<n)
        N<<=1;

    for (int i=1;i<=n;i++)
    {
        f>>v[i];
        UP(1,1,N,i,i,v[i]);
    }

    for (int i=1;i<=q;i++)
    {
        int t,a,b;
        f>>t>>a>>b;
        if(t==1)
        {
            UP(1,1,N,a,a,b-tree[a+N-1]);
        }
        else
            g<<query(1,1,N,a,b)<<'\n';
    }


    return 0;
}