Cod sursa(job #1895154)

Utilizator mateigabriel99Matei Gabriel mateigabriel99 Data 27 februarie 2017 20:17:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

#define NMax 100005

using namespace std;

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

int N,M;
int BIT[NMax];

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

void Update(int x,int value)
{
    for(int i=x;i<=N;i+=zeros(i))
        BIT[i]=BIT[i]+value;
}

int Sum(int x)
{
    int sum=0;
    for(int i=x;i>=1;i-=zeros(i))
        sum=sum+BIT[i];
    return sum;
}

int Search(int value)
{
    int step,vals=0,index=0;
    for(step=1;step<=N;step<<=1);
    for(step;step;step>>=1)
        if(index+step<=N && vals+BIT[index+step]<=value)
            vals+=BIT[index+=step];
    return index;
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        int x;
        fin>>x;
        Update(i,x);
    }
    for(int i=1;i<=M;i++)
    {
        int op,x,y;
        fin>>op;
        if(op==0)
        {
            fin>>x>>y;
            Update(x,y);
        }
        if(op==1)
        {
            fin>>x>>y;
            fout<<Sum(y)-Sum(x-1)<<"\n";
        }
        if(op==2)
        {
            fin>>x;
            int index=Search(x);
            if(1<=index && index<=N && Sum(index)==x)
                fout<<index<<"\n";
            else
                fout<<"-1\n";
        }
    }
    return 0;
}