Cod sursa(job #2075511)

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