Cod sursa(job #1954097)

Utilizator SkiryFarauanu Ionut Skiry Data 5 aprilie 2017 10:44:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#define v(x) ( (-x)&x )
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,a[100001],i,m,op,b,c,el;
void update(int valoare,int poz)
{
    for(int i=poz;i<=n;i+=v(i)) a[i]+=valoare;
}
int query(int poz)
{
    int suma=0;
    for(int i=poz;i>0;i-=v(i)) suma+=a[i];
    return suma;
}
int verifica(int valoare)
{
    int suma;
    for(suma=1;suma<n;suma<<=1) ;
    for(int i=0;suma;suma>>=1)
    {
        if(i+suma<=n)
        {
            if(valoare>=a[i+suma])
            {
                i+=suma;
                valoare-=a[i];
                if(!valoare) return i;
            }
        }
    }
    return -1;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>el;
        update(el,i);
    }
    for(i=1;i<=m;i++)
    {
        f>>op;
        if(op==2)
        {
            f>>b;
            g<<verifica(b)<<'\n';
        }
        else if(op==1)
        {
            f>>c>>b;
            int s1=query(b);
            int s2=query(c-1);
            g<<s1-s2<<'\n';
        }
        else
        {
            f>>c>>b;
            update(b,c);
        }
    }
    return 0;
}