Cod sursa(job #2503926)

Utilizator RadianElevenAdrian Ariotn RadianEleven Data 3 decembrie 2019 22:29:53
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda mirceaputemdadela8faraunsfert Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int n, q;
int vek[15005];
int logs[100000];
int aint[100][5011];
void addaint(int poz, int a)
{
    aint[0][poz]=a;
    int i=0;
    while(i<=logs[2*n-1])
    {
        i++;
        aint[i][(poz+1)/2]+=a;
        poz=(poz+1)/2;
    }
}
void subs(int v, int z)
{
    int i=-1;
    int poz=z;
    while(i<=logs[2*n-1])
    {
        i++;
        aint[i][poz]-=v;
        poz=(poz+1)/2;
    }
}
bool containspoz(int r, int p,  int poz)
{
    if((1<<r)*(p-1)+1 <=poz && poz<=(1<<r)*p)
    return true;
    return false;
}
int query(int poz)
{
    if(poz==0)
        return aint[0][1];
    int s=0;
    int r=logs[2*n-1];
    int p=1;
    while(!(r==0  && p==poz))
    { cout<<r<<" "<<containspoz(r,p,poz)<<" ";
        if(containspoz(r,p,poz))
            {
            r--;
            p*=2;
            p--;
            }
        else {
            s+=aint[r][p];
            p++;
        }
    }
    return s;
}
int main()
{
    f>>n>>q;
    for(int i=1;i<=100001;++i)
    {
        logs[i]=logs[i/2]+1;
    }
    cout<<"j";
    for(int i=1;i<=n;++i)
    {
        f>>vek[i];
        addaint(i, vek[i]);
         cout<<"j";
    }

    for(int i=1;i<=q;++i)
    {
        cout<<"k";
        int t;
        f>>t;
        if(t==0)
        {
            int z, v;
            f>>z>>v;
            subs(v,z);

        }
        else {
            int p,q;
            f>>p>>q;
            int s=0;
            cout<<query(q)<<" "<<query(p-1);
            s=query(q)-query(p-1);
            g<<s<<"\n";
        }
    }
    return 0;
}