Cod sursa(job #2457804)

Utilizator bori2000Fazakas Borbala bori2000 Data 18 septembrie 2019 19:16:38
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

int n, m;
int a[15001];
int aib[15001];

int min_kettohatv(int k)
{
    return (k ^ (k-1)) & k;
}

int osszeg(int kezd, int veg)
{
    int ered = 0;
    for(int i=kezd; i<=veg; i++)
    {
        ered+=a[i];
    }
    return ered;
}

void fizet(int nap, int penz)
{
    for(int i=nap; i<=n; i+=min_kettohatv(i))
    {
        aib[i]-=penz;
    }
}

int lekerdez(int kezd, int veg)
{
    int ered_veg = 0;
    for(int i=veg; i>=1; i-=min_kettohatv(i))
    {
        ered_veg += aib[i];
    }

    int ered_kezd = 0;
    for(int i=kezd-1; i>=1; i-=min_kettohatv(i))
    {
        ered_kezd += aib[i];
    }
    return ered_veg-ered_kezd;
}

int main()
{
    ifstream f("datorii.in");
    ofstream g("datorii.out");

    //adatok beolvasasa
    f>>n>>m;

    for(int i=1; i<=n; i++) f>>a[i];

    //binarisan indexelt fa letrehozasa(lasd a cikket az Infoarenan)
    for(int i=1; i<=n; i++)
    {
        //cout<<i<<" "<<i-min_kettohatv(i)+1<<endl;
        aib[i]=osszeg(i-min_kettohatv(i)+1, i);
    }

    //muveletek feldolgozasa
    int kod, a, b;
    for(int i=1; i<=m; i++)
    {
        f>>kod>>a>>b;

        if(kod==0)
        {
            fizet(a, b);
        }
        else g<<lekerdez(a, b)<<endl;
    }


    return 0;
}