Cod sursa(job #2046531)

Utilizator patcasrarespatcas rares danut patcasrares Data 23 octombrie 2017 21:24:58
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<fstream>
#include<vector>
#include<queue>
#define DN 200005
#include<iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int a[DN],n,m,t,s[DN],b,type,x,y,v;
int bit(int x)
{
    return (x^(x&(x-1)));
}
void actualizare(int x,int y)
{
    v=x;
    while(v<=n)
    {
        b=bit(v);
        a[v]+=y;
        v+=b;
    }
}
int suma(int x)
{
    int s=0,poz=0;
    for(int i=18;i>=0&&poz<=x;i--)
        if(poz+(1<<i)<=x)
        {
            poz+=(1<<i);
            s+=a[poz];
        }
    return s;
}
int pozmin(int x)
{
    int poz=0,s=0,c;
    for(int i=18;i>=0;i--)
    {
        c=poz+(1<<i);
       // cout<<a[c]<<'\n';
        if(s+a[c]<=x&&c<=n)
        {
            poz=c;
            s=s+a[c];
            //cout<<poz<<'\n';
            if(s==x)
                break;
        }
    }
    //cout<<s<<'\n';
    if(s!=x)
        poz=-1;
    return poz;
}
int main()
{
    cout<<2*sizeof(a)/1000<<'\n';
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>t;
        s[i]=s[i-1]+t;
        for(int j=0;j<=18;j++)
            if(i%(1<<j)==0)
                b=(1<<j);
            else
                break;
        a[i]=s[i]-s[i-b];
    }
for(int i=1;i<=n;i++)
        cout<<a[i]<<' ';
    cout<<'\n';
    for(int i=1;i<=m;i++)
    {
        fin>>type;
        if(type==0)
        {
            fin>>x>>y;
            actualizare(x,y);for(int i=1;i<=n;i++)
        cout<<a[i]<<' ';
    cout<<'\n';
        }
        if(type==1)
        {
            fin>>x>>y;
            //fout<<suma(y)-suma(x-1)<<'\n';
        }
        if(type==2)
        {
            fin>>x;
           // fout<<pozmin(x)<<'\n';
        }
    }
}