Cod sursa(job #1520405)

Utilizator danstefanDamian Dan Stefan danstefan Data 8 noiembrie 2015 18:06:16
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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,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 a,int b)
{
    int i,s1=0,s2=0;
    for(i=a-1; i>0; i-=UB(i))
        s1+=aib[i];
    for(i=b; i>0; i-=UB(i))
        s2+=aib[i];
    return s2-s1;
}
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(pi,ps)<<'\n';
        }
        else
        {
            scanf("%d",&su);
            p=1;u=n;
            while(p<=u){
                mi=(p+u)/2;
            ss=Suma(1,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;
}