Cod sursa(job #1520410)

Utilizator danstefanDamian Dan Stefan danstefan Data 8 noiembrie 2015 18:18:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define UB(x) (x&(-x))
using namespace std;
int n,m,i,x,aib[100010],pi,ps,p,va,su,in,po,u,mi;
long long ss;
char ce;
void Add(int poz,int val)
{
    int i;
    for(i=poz; i<=n; i+=UB(i))
        aib[i]+=val;
}
int Suma(int pz)
{
    int i;
    long long s=0;
    for(i=pz; i; i-=UB(i))
        s+=aib[i];
    return s;
}
int main()
{
    freopen("aib.in","r",stdin);
    ofstream g ("aib.out");
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; ++i)
    {
        scanf("%d",&x);
        Add(i,x);
    }
    for(i=1; i<=m; ++i)
    {
        scanf("\n");
        scanf("%c",&ce);
        if(ce=='0')
        {
            scanf("%d%d",&p,&va);
            Add(p,va);
        }
        else if(ce=='1')
        {
            scanf("%d%d",&pi,&ps);
            g<<Suma(ps)-Suma(pi-1)<<'\n';
        }
        else
        {
            scanf("%d",&su);
            po=0;
            p=1;
            u=n;
            while(p<=u)
            {
                mi=(p+u)/2;
                ss=Suma(mi);
                if(ss==su)
                {
                    po=mi;
                    u=mi-1;
                }
                else if(ss>su)u=mi-1;
                else p=mi+1;
            }
            if(po)g<<po<<'\n';
            else g<<-1<<'\n';
        }
    }
    return 0;
}