Cod sursa(job #3159426)

Utilizator proflaurianPanaete Adrian proflaurian Data 21 octombrie 2023 12:02:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int N = 100010;
int n,q,aib[N];

void add(int poz,int val)
{
    for(int i=poz;i<=n;i+=i&(-i))
        aib[i]+=val;
}
int suma(int poz)
{
    int sum=0;
    for(int i=poz;i;i-=i&(-i))
        sum+=aib[i];
    return sum;
}
int suma(int st,int dr)
{
    return suma(dr)-suma(st-1);
}

int main()
{
    f>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int x;
        f>>x;
        add(i,x);
    }
    for(;q;q--)
    {
        int tip;
        f>>tip;
        if(tip==0)
        {
            int poz,val;
            f>>poz>>val;
            add(poz,val);
        }
        else if(tip==1)
        {
            int st,dr;
            f>>st>>dr;
            g<<suma(st,dr)<<'\n';
        }
        else
        {
            int sum;
            f>>sum;
            int lo=0,hi=n,mi;
            while(hi-lo>1)
            {
                mi=(lo+hi)/2;
                if(suma(mi)<sum)
                    lo=mi;
                else
                    hi=mi;
            }
            if(suma(hi)==sum)
                g<<hi<<'\n';
            else
                g<<"-1\n";
        }
    }
    return 0;
}


//8 6
//0  1   2  3  4  5  6  7  8
//0 25  42  8 15  1 55 16 67 v
//   *      *     *     *
//   *   *        *  *
//   *   *  *  *
//   *   *  *  *  *  *  *  *
//    1-> 1 2 4 8 ....
//    2-> 2 4 8
//    3-> 3 4 8
//    4-> 4 8
//    5-> 5 6 8 5+1=6;6+2=8 8+8=16 prea mare
//    6-> 6 8
//    7-> 7 8
//    8-> 8
////  a1  a2 a3 a4 a5 a6 a7 a8
////  s1=a1  1
////  s2=a2  2
////  s3=a3+a2 1+2
////  s4=a4 4
////  s5=a5+a4 1+4
////  s6=a6+a4 2+4
////  s7=a7+a6+a4 1+2+4  2+4 4 0
////  s8=a8 8
////
////  43 = 1 + 2 + 8 + 32 43
////  42 =     2 + 8 + 32 41-42
////  40 =         8 + 32 33-40
////  32 =             32 1 -32
////   0
////   lsb(x)=x&(-x)
//5=1+4 -> 5+1=6=2+4
//6=2+4 -> 2+2+4=4+4=8
//43 = 1+2+8+32
//44 = 4+8+32
//48 = 16+32
//64 = 64
//128 = 64+64 > n = 100