Cod sursa(job #2965487)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 15 ianuarie 2023 14:01:19
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>
using namespace std;
const int nmx = 1e5+1;
#if 1
#define cin fin
#define cout fout
ifstream fin("aib.in");
ofstream fout("aib.out");
#endif
int a[nmx];
int t[nmx*4];
void create(int idx,int st,int dr){
    if(st == dr){
        t[idx] = a[st];
    }
    else{
        int md = (st + dr)/2;
        create(idx*2,st,md);
        create(idx*2+1,md+1,dr);
        t[idx] = t[idx*2] + t[idx*2+1];
    }
}

void printt(int idx,int st,int dr){
    if(st == dr){
        cout << t[idx] << " ";
    }
    else{
        int md = (st + dr)/2;
        printt(idx*2,st,md);
        printt(idx*2+1,md+1,dr);
    }
}

void update(int idx,int st,int dr, int p, int add){
    if(st == dr){
        t[idx] += add;
    }
    else{
        int md = (st+dr)/2;
        if(p<=md)
            update(idx*2,st,md,p,add);
        else
            update(idx*2+1,md+1,dr,p,add);
        t[idx] = t[idx*2] + t[idx*2+1];
    }
}

int query(int idx,int st,int dr,int a,int b){
    if(a>b)
        return 0;
    if(st == a && dr == b){
        return t[idx];
    }
    int md = (st+dr)/2;
    return query(idx*2,st,md,a,min(md,b)) + query(idx*2+1,md+1,dr,max(md+1,a),b);
}

int query2(int idx,int st,int dr,int x){
    if(x == t[idx]){
        return dr;
    }
    else if (st == dr){
        return -1;
    }
    else{
        int md = (st+dr)/2;
        int res = -1;
        if(t[idx*2]>=x)
            res = max(res,query2(idx*2,st,md,x));
        else
            res = max(res,query2(idx*2+1,md+1,dr,x-t[idx*2]));
        return res;
    }
}

int main() {
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++)
        cin >> a[i];
    create(1,1,n);
    while(m--){
        int op,x,y;
        cin >> op;
        if(op == 0){
            cin >> x >> y;
            update(1,1,n,x,y);
        }
        else if(op == 1){
            cin >> x >> y;
            cout << query(1,1,n,x,y)<<"\n";
        }
        else{
            cin >> x;
            cout << query2(1,1,n,x) << "\n";
        }
    }
}