Cod sursa(job #2046471)

Utilizator patcasrarespatcas rares danut patcasrares Data 23 octombrie 2017 20:28:39
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<fstream>
#include<vector>
#include<queue>
#define DN 300005
#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;
void actualizare(int x,int y)
{
    a[x]+=y;
   /* for(int i=0;i<=18;i++)
        if(!((1<<i)&5))
            cout<<0;
        else
            cout<<1;
        cout<<'\n';
    for(int i=0;i<=18;i++)
        if(!((1<<i)&6))
            cout<<0;
        else
            cout<<1;
        cout<<'\n';*/
    for(int i=1;i<=18;i++)
        if(!((1<<i)&x))
        {
            v=0;
            for(int j=18;j>i;j--)
                if((1<<j)&x)
                    v=v*2+1;
                else
                    v*=2;
            v=v*2+1;
            for(int j=i-1;j>=0;j--)
                v*=2;
            //cout<<v<<'\n';
            a[v]+=y;
        }
}
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()
{
    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<=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';
        }
        if(type==2)
        {
            fin>>x;
            fout<<pozmin(x)<<'\n';
        }
    }
}