Cod sursa(job #1480956)

Utilizator clipastefanClipa Stefan clipastefan Data 3 septembrie 2015 15:14:27
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <bitset>
#define LSB(x) x&(-x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,a,b,i,c,L,R,M,x[100010],query(int);
void upd(int,int);
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>a;
        upd(i,a);
    }
    for(;m;m--)
    {
        f>>c>>a;
        if(c==0)
        {
            f>>b;
            upd(a,b);
            continue;
        }
        if(c==1)
        {
            f>>b;
            g<<query(b)-query(a-1)<<"\n";
            continue;
        }
        if(query(n)<a)
        {
            g<<"-1\n";
            continue;
        }
        L=0;R=n;
        for(;R-L-1;)
        {
            M=(R+L)/2;
            if(query(M)<a)L=M;
            else R=M;
        }
        if(query(R)>a)
        {
            g<<"-1\n";
            continue;
        }
        g<<R<<"\n";
    }
    return 0;
}
void upd(int poz,int val)
{
    for(;poz<=n;poz+=LSB(poz))
        x[poz]+=val;
}
int query(int poz)
{
    int ret=0;
    for(;poz;poz-=LSB(poz))
        ret+=x[poz];
    return ret;
}