Cod sursa(job #1131485)

Utilizator niktudyNica Tudor niktudy Data 28 februarie 2014 20:29:14
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");
int a[70000],n,m,zi,b,suma,poz1=1;
int calc (int poz)
{
    if (a[poz]!=-1)
        return a[poz];
    if (poz>poz1<<1)
        return 0;
    a[poz]=calc(poz<<1)+calc((poz<<1)+1);
}
void update (int poz)
{
    if (!poz)
        return;
    a[poz]-=b;
    update (poz>>1);
}
void querry (int poz,int st,int dr)
{
    if (st>=zi&&dr<=b)
    {
        suma+=a[poz];
        return;
    }
    int mij=(st+dr)>>1;
    if (mij>=zi)
        querry (poz<<1,st,mij);
    if (mij<b)
        querry ((poz<<1)+1,mij+1,dr);
}
int main()
{
    int i,tip;
    fin>>n>>m;
    while (poz1<n)
        poz1=poz1<<1;
    //fout<<poz1<<'\n';
    for (i=1;i<=(poz1<<2);i++)
        a[i]=-1;
    for (i=1;i<=n;i++)
        fin>>a[poz1+i-1];
    calc (1);
    //for (i=1;i<=poz1*2-1;i++)
        //fout<<a[i]<<' ';
    for (i=1;i<=m;i++)
    {
        fin>>tip>>zi>>b;
        if (!tip)
            update (zi+poz1-1);
        else
        {
            suma=0;
            querry (1,1,poz1);
            fout<<suma<<'\n';
        }
    }
    fin.close ();
    fout.close ();
    return 0;
}