Cod sursa(job #2778088)

Utilizator Alexandru_OlteanuAlexandru Olteanu Alexandru_Olteanu Data 28 septembrie 2021 13:54:46
Problema Arbori indexati binar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.91 kb
/*
    Programmer : Alexandru Olteanu
*/
#include<bits/stdc++.h>
using namespace std;
// GCC Optimizations
// #pragma GCC optimize("Ofast");
// #pragma GCC target("fma,sse,sse2,sse3,ssse3,sse4,popcnt")
// #pragma GCC target("abm,mmx,avx,avx2,tune=native")
// #pragma GCC optimize(3)
// #pragma GCC optimize("inline")
// #pragma GCC optimize("-fgcse")
// #pragma GCC optimize("-fgcse-lm")
// #pragma GCC optimize("-fipa-sra")
// #pragma GCC optimize("-ftree-pre")
// #pragma GCC optimize("-ftree-vrp")
// #pragma GCC optimize("-fpeephole2")
// #pragma GCC optimize("-ffast-math")
// #pragma GCC optimize("-fsched-spec")
// #pragma GCC optimize("unroll-loops")
// Useful
mt19937 rng((unsigned int) chrono::steady_clock::now().time_since_epoch().count());
#define FastEverything  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define HighPrecision cout<<fixed<<setprecision(17);
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll const mod=1000000007LL;
ll const mod2 = 100000000LL;
ll const md=998244353LL;
ll mypowr(ll a,ll b, ll mod1) {ll res=1;if(b<0)b=0;a%=mod1; assert(b>=0);
for(;b;b>>=1){if(b&1)res=res*a%mod1;a=a*a%mod1;}return res;}
ll mypow(ll a,ll b) {ll res=1;if(b<0)b=0;assert(b>=0);
for(;b;b>>=1){if(b&1)res=res*a;a=a*a;}return res;}
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(), x.rend()

ifstream in("aib.in");
ofstream out("aib.out");
#define cin in
#define cout out

const ll infll = 9e18;
const int inf = 2e9;
const ll maxn = 1e5 + 2;



int a[maxn];
int tree[4 * maxn];

ll func(int x, int y){
    return x + y;
}

void build(int node, int l, int r){
    if(l == r){
        tree[node] = a[l];
        return;
    }
    int mid = l + (r - l) / 2;
    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);
    tree[node] = func(tree[2 * node], tree[2 * node + 1]);
}

void update(int node, int l, int r, int x){
    if(x < l || x > r){
        return;
    }
    if(l == r){
        tree[node] = a[l];
        return;
    }
    int mid = l + (r - l) / 2;
    update(2 * node, l, mid, x);
    update(2 * node + 1, mid + 1, r, x);
    tree[node] = func(tree[2 * node], tree[2 * node + 1]);

}

ll sum(int node, int l, int r, int L, int R){
    if(l >= L && r <= R){
        return tree[node];
    }
    int mid = l + (r - l) / 2;
    if((l <= R && mid >= L) && (mid + 1 > R || r < L)){
        return sum(2 * node, l, mid, L, R);
    }
    if((l > R || mid < L) && (mid + 1 <= R && r >= L)){
        return sum(2 * node + 1, mid + 1, r, L, R);
    }
    return func(sum(2 * node, l, mid, L, R), sum(2 * node + 1, mid + 1, r, L, R));
}


int main()
{
    FastEverything
    HighPrecision
    int test = 1;
    //cin>>test;
    for(int tt = 1; tt <= test; ++tt){
       int n, q;
       cin>>n>>q;
       for(int i = 1; i <= n; ++i){
           cin>>a[i];
       }
       build(1, 1, n);
       
       while(q--){
           int p, x, y;
           cin>>p>>x;
           if(p == 0){
               cin>>y;
               a[x] += y;
               update(1, 1, n, x);
           }
           if(p == 1){
               cin>>y;
               cout<<sum(1, 1, n, x, y)<<'\n';
           }
           if(p == 2){
               int k = -1;
               int lo = 1, hi = n;
               while(lo <= hi){
                   int mid = lo + (hi - lo) / 2;
                   int s = sum(1, 1, n, 1, mid);
                   if(s == x){
                       k = mid;
                       lo = hi + 1;
                       continue;
                   }
                   if(s > x){
                       hi = mid - 1;
                   }
                   else{
                       lo = mid + 1;
                   }
               }
               cout<<k<<'\n';
           }
       }

    }    


    return 0;
}