Cod sursa(job #2381168)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 16 martie 2019 10:25:57
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <cstdio>
using namespace std;

int a[400001];
int n, m, x, y;
int pb;

void upd(int st, int dr, int poz)
{
    if(st == dr)
    {
        a[poz] = a[poz] - y;
        return;
    }
    if(x <= (st + dr)/2)
    {
        upd(st, (st + dr)/2, poz*2);
    }
    else
    {
        upd((st + dr)/2+1, dr, poz*2+1);
    }
    a[poz] = a[poz*2] + a[poz*2+1];
}

int afis(int st, int dr, int poz)
{
    if(x <= st && y >= dr)
        return a[poz];
    if(x > dr || y < st)
        return 0;
    else
    {
        return afis(st, (st + dr)/2, poz*2) + afis((st + dr)/2+1, dr, poz*2+1);
    }
}

void rez()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i<=n; i++)
    {
        scanf("%d", &y);
        y*=-1;
        x = i;
        upd(1, n, 1);
    }
    for(int i = 0; i<m; i++)
    {
        scanf("%d %d %d", &pb, &x, &y);
        if(pb == 1)
        {
            printf("%d\n", afis(1, n, 1));
        }
        else
        {
            upd(1, n, 1);
        }
    }
}

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