Cod sursa(job #1414403)

Utilizator stefantrettTrett Stefan stefantrett Data 2 aprilie 2015 16:26:42
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define nMax 100001

using namespace std;

int i,k,v[50005];
int j,a,b,c,x,y,d;
int val,n,m,maxi;
int in[15001],suma;

void update(int st,int dr,int nod)
{
    if(st == dr)
    {
        v[nod]-=b;
        return;
    }
    int mij = (st+dr)/2;
    if(a>mij)
        update(mij+1, dr, (nod<<1)+1);
    else
        update(st, mij, (nod<<1));

    v[nod]=v[nod<<1]+v[(nod<<1)+1];
}

void build(int st,int dr,int nod)
{
    if(st==dr)
    {
        v[nod]=in[st];
        return;
    }
    int mij=(st+dr)/2;
    build(st,mij,nod<<1);
    build(mij+1,dr,nod*2+1);
    v[nod]=v[nod*2]+v[nod*2+1];

}

void cherry(int st,int dr,int nod)
{
    if(st>=a && dr<=b)
    {
        suma+=v[nod];
        return;
    }
    if(st>b||dr<a) return;
    int mij=(st+dr)/2;
    cherry(st,mij,nod<<1);
    cherry(mij+1,dr,nod*2+1);
}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    scanf("%d %d\n", &n, &m);
    for(int i=1;i<=n;++i)
        scanf("%d ", &in[i]);
    build(1, n, 1);
    scanf("\n");
    for(int i=1;i<=m;++i)
    {
        int p;
        scanf("%d %d %d\n", &p, &a, &b);
        if(p == 0)
            update(1,n,1);
        else
        {
            suma = 0;
            cherry(1,n,1);
            printf("%d\n", suma);
        }
    }
    return 0;
}