Cod sursa(job #2276861)

Utilizator DordeDorde Matei Dorde Data 5 noiembrie 2018 15:43:35
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#define zeros(x) x&(-x)
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
int const NM = 1e5;
int v [1 + NM] , aib [1 + NM] , n;
inline void add (int pos , int nr){
    for(int i = pos ; i <= n ; i += zeros(i))
        aib [i] += nr;
}
inline int best (int pos){
    int ans = 0 ;
    for(int i = pos ; i ; i -= zeros(i))
        ans += aib [i];
    return ans;
}
inline bool check (int nr , int val){
    return (best (nr) == val);
}
int main()
{
    int q;
    f >> n >> q;
    for(int i = 1 ; i <= n ; ++ i){
        int a;
        f >> a;
        add (i , a);
    }
    for(int i = 1 ; i <= q ; ++ i){
        int a , b , p;
        f >> p;
        if (p == 2)
            f >> a;
        else
            f >> a >> b;
        if (! p)
            add (a , b);
        if (p == 1)
            g << best (b) - best (-1 + a) << '\n';
        if (p == 2){
            int pas = (1 << 16)  , found = 0;
            while (pas){
                if (pas + found <= n && check (pas + found , a))
                    found += pas;
                pas /= 2;
            }
            g << found << '\n';
        }
    }
    return 0;
}