Cod sursa(job #2867028)

Utilizator 100pCiornei Stefan 100p Data 10 martie 2022 10:17:45
Problema Arbori indexati binar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>
#define pb push_back
#define MAX 100000
#define mp make_pair
#define mod 1000000007
#define ll long long
#define ull unsigned long long
#define fastio ios_base::sync_with_stdio(NULL),cin.tie(NULL),cout.tie(NULL);
#define FILES freopen("aib.in","r",stdin);\
              freopen("aib.out","w",stdout);
using namespace std;
int n,m,tree[MAX*4+5],v[MAX+5],ans,op,pos,val,st,dr,s;
void update(int st,int dr,int node,int pz,int val)
{
    if(st == dr)
    {
        tree[node] += val;
        return;
    }
    int mid = (st + dr) >> 1;
    if(pz <= mid) update(st,mid,(node<<1)+1,pz,val);
    else update(mid+1,dr,(node<<1)+2,pz,val);
    tree[node] = tree[(node<<1)+1] + tree[(node<<1)+2];
}
void query(int st,int dr,int node,int x,int y)
{
    if(st >= x && y >= dr)
    {
        ans += tree[node];
        return;
    }
    int mid = (st + dr) >> 1;
    if(x <= mid) query(st,mid,(node<<1)+1,x,y);
    if(mid < y) query(mid+1,dr,(node<<1)+2,x,y);
}
int main()
{
    fastio
    FILES
    cin >> n >> m;
    for(int i = 1;i <= n; ++i)
        cin >> v[i],update(1,n,0,i,v[i]);
    for(int i = 1;i <= m; ++i)
    {
        cin >> op;
        if(!op)
        {
            cin >> pos >> val;
            update(1,n,0,pos,val);
            continue;
        }
        if(op == 1)
        {
            cin >> st >> dr;
            ans = 0;
            query(1,n,0,st,dr);
            cout << ans << '\n';
            continue;
        }
        cin >> s;
        int st = 1,dr = n,sol = 1e9;
        while(st <= dr)
        {
            int mid = (st + dr) >> 1;
            ans = 0;
            query(1,n,0,1,mid);
            if(ans < s) st = mid + 1;
            else if(ans > s) dr = mid - 1;
            else
            {
                sol = min(sol,mid);
                dr = mid - 1;
            }
        }
        cout << (sol == 1e9 ? -1 : sol) << '\n';
    }
}