Cod sursa(job #2392170)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 29 martie 2019 19:01:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#define pas(x) x&(-x)
using namespace std;

int a[100001];
int s[100001];
int n, m;
int x;
int tip, aa, bb;

void add(int poz, int ce){

    for(int i=poz; i<=n; i+=pas(i))
        a[i]+=ce;
}

int calculez_pe_interval(int deunde){

    int s=0;
    for(int i=deunde; i>0; i-=pas(i))
        s+=a[i];
    return s;
}
int put;

int cautpoz(int k){

    int i;
    int lg=put;
    for(i=1;lg;lg>>=1)
        if(i+lg<=n && calculez_pe_interval(i+lg)<=k)
            i+=lg;
    if(calculez_pe_interval(i+lg) !=k)
        return -1;
    return i;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(put=1; put<=n;put<<=1);
    for(int i=1; i<=n; i++){
        scanf("%d", &x);
        add(i,x);
    }
    for(int i=1; i<=n; i++)
        s[i]=s[i-1]+a[i];
    for(int j=1; j<=m; j++){
        scanf("%d %d", &tip, &aa);
        if(tip<2)
            scanf("%d", &bb);
        if(tip==0){
            add(aa,bb);
        }
        else if(tip==1)
            printf("%d\n",calculez_pe_interval(bb)-calculez_pe_interval(aa-1));
        else if(tip==2)
            printf("%d\n",cautpoz(aa));
       // else if(tip==2
    }
    return 0;
}