Cod sursa(job #2322792)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 18 ianuarie 2019 12:49:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int a[100001],n;
void upd(int i,int x){
    while(i<=n){
        a[i]+=x;
        i+=(i&(-i));
    }
}
int cer1(int i){
    int s=0;
    while(i>0){
        s+=a[i];
        i-=(i&(-i));
    }
    return s;
}
int cer2(int x){
    int pas=(1<<17),r=0,s=x;
    for(; pas; pas/=2)
        if(r+pas<=n && a[r+pas]<x)
            x-=a[(r+=pas)];
    if(cer1(r+1)!=s)
        return -1;
    return r+1;
}
int main(){
    int m,i,j,t;
    in>>n>>m;
    for(i=1; i<=n; ++i){
        in>>j;
        upd(i,j);
    }
    while(m--){
        in>>t>>i;
        if(!t){
            in>>j;
            upd(i,j);
        }
        else if(t==1){
            in>>j;
            out<<cer1(j)-cer1(i-1)<<"\n";
        }
        else
            out<<cer2(i)<<"\n";
    }
    return 0;
}