Cod sursa(job #3166299)

Utilizator NathanBBerintan Emanuel Natanael NathanB Data 8 noiembrie 2023 11:40:47
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;
#define cin fin
#define cout fout
ifstream fin("aib.in");
ofstream fout("aib.out");
int main()
{
    int n,q;
    cin>>n>>q;
    vector<int> v(n),aib(n+3);
    for(int i=0;i<n;i++)
    {
        cin>>v[i];
        for(int p=i;p<n;p|=p+1)
            aib[p] += v[i];
    }
    for(int i=0;i<q;i++)
    {
        int c;
        cin>>c;
        if(c==0)
        {
            int poz,val;
            cin>>poz>>val;
            --poz;
            for(int p=poz;p<n;p|=p+1)
                aib[p] += val;
        }
        else if(c==1)
        {
            int st,dr;
            cin>>st>>dr;
            --st;
            --dr;
            int s2=0,s1=0;
            for(int p=dr;p>=0;p = (p&(p+1))-1)
                s2 += aib[p];
            for(int p=st-1;p>=0;p = (p&(p+1))-1)
                s1 += aib[p];
            cout<<s2-s1<<'\n';
        }
        else
        {
            int val;
            cin>>val;
            int st = 0, dr = n-1;
            while(st<dr)
            {
                int mij = (st+dr)>>1;
                int nr = 0;
                for(int p=mij;p>=0;p = (p&(p+1))-1)
                    nr += aib[p];
                if(nr < val)
                    st = mij+1;
                else if(nr > val) dr = mij-1;
                else
                {
                    st = mij;
                    break;
                }
            }
            int nr = 0;
            for(int p=st;p>=0;p = (p&(p+1))-1)
                {nr += aib[p];
                if(p==0) break;}
            if(nr==val)
                cout<<st+1<<'\n';
            else
                cout<<-1<<'\n';
        }
    }
    return 0;
}