Cod sursa(job #2089143)

Utilizator alexilasiAlex Ilasi alexilasi Data 16 decembrie 2017 11:08:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int zeros(int x)
{
    return (x^(x-1))&x;
}

int n,m,i,x,b,c,j,ans;

int a[100001];

void build()
{
    for(int q=1;q<=n;q++)
        if(zeros(q)+q<=n)
            a[zeros(q)+q]+=a[q];
}

void update(int p,int x)
{
    for(;p<=n;p+=zeros(p))
        a[p]+=x;
}

int query(int x)
{
    int ans=0;
    for(;x>0;x-=zeros(x))
        ans+=a[x];
    return ans;
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>a[i];
    build();
    for(i=1;i<=m;i++)
    {
        fin>>x>>b;
        if(x==0||x==1)fin>>c;
        if(x==0)
            update(b,c);
        else if(x==1)
        {
            fout<<query(c)-query(b-1)<<'\n';
        }
        else
        {
            for(j=1;j<=n;j<<=1);
            ans=0;
            for(;j;j>>=1)
                if(ans+j<=n)
                    if(query(ans+j)<b)
                        ans+=j;
            if(query(ans+1)==b)
            {
                fout<<ans+1<<'\n';
            }
            else fout<<-1<<'\n';
        }
    }
    return 0;
}