Cod sursa(job #1516967)

Utilizator LipanmateiLipan Radu-Matei Lipanmatei Data 3 noiembrie 2015 19:07:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
using namespace std;
#define zeros(x) (x&-x)
ifstream fin("aib.in");
ofstream fout("aib.out");
int AIB[100001];
int n,m;
void add(int x, int cant)
{
    for(int i=x;i<=n;i+=zeros(i))
        AIB[i]+=cant;
}
int suma(int x)
{
    int s=0;
    for(int i =x;i>0;i-=zeros(i))
        s+=AIB[i];
    return s;
}
int search(int val)
{
    int i, step;
    for(step=1;step<n;step<<=1);
    for(i=0;step;step>>=1)
        if(i+step<=n&&val>=AIB[i+step])
        {
            i+=step;
            val-=AIB[i];
            if(!val)return i;
        }
    return -1;

}
void caz0(){
    int a,b;
    fin>>a>>b;
    add(a,b);
}
void caz1(){
    int a,b;
    fin>>a>>b;
    fout<<suma(b)-suma(a-1)<<'\n';
}
void caz2(){
    int a;
    fin>>a;
    fout<<search(a)<<'\n';
}
int main()
{
    int x;
    fin>>n>>m;
    for(int i=1;i<=n;i++)fin>>x,add(i,x);
    for(int i=1;i<=m;i++)
    {
        fin>>x;
        switch(x)
        {
            case 0:caz0();break;
            case 1:caz1();break;
            case 2:caz2();break;
        }
    }
    return 0;
}