Cod sursa(job #2018197)

Utilizator cipri321Marin Ciprian cipri321 Data 3 septembrie 2017 21:58:46
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#define DIM 1<<17
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int AIB[DIM];
int n,m;

int lsb(int x)
{
    return (x^(x-1))&x;
}
void update(int p,int v)
{
    for(int i=p;i<=n;i+=lsb(i))
        AIB[i]+=v;
}
int query(int p)
{
    int rez=0;
    for(int i=p;i>0;i-=lsb(i))
        rez+=AIB[i];
    return rez;
}
int cauta(int s)
{
    int p=0;
    for(int i=DIM;i>0;i>>=1)
        if(p+i<=n&&AIB[p+i]<=s)
            s-=AIB[p+i],p+=i;
    if(s==0&&p!=0)
        return p;
    else
        return -1;
}
int main()
{
    fi>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a;
        fi>>a;
        update(i,a);
    }
    for(int i=1;i<=m;i++)
    {
        int tip;
        fi>>tip;
        if(tip==0)
        {
            int a,b;
            fi>>a>>b;
            update(a,b);
        }
        else if(tip==1)
        {
            int a,b;
            fi>>a>>b;
            fo<<query(b)-query(a-1)<<"\n";
        }
        else
        {
            int a;
            fi>>a;
            fo<<cauta(a)<<"\n";
        }
    }
    fi.close();
    fo.close();
    return 0;
}