Cod sursa(job #1342425)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 13 februarie 2015 23:48:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#define DIM 100011
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,qw;
int A[DIM];

void update(int p,int x){
    for(;p<=n;p+=p&(-p)) A[p]+=x;
}

int query1(int p){
    int r=0;
    for(;p>0;p-=p&(-p)) r+=A[p];
    return r;
}

int query2(int a){
    int p=1,d=qw,r=0;
    for(;d>0;d/=2){
        if(p+d-1<=n && A[p+d-1]<=a){
            a-=A[p+d-1];
            if(!a) return p+d-1;
            p+=d;
        }
    }
    return -1;
}

int main(void){
    register int i,j,t,a,b;

    f>>n>>m;
    for(qw=1;qw<=n;qw*=2);
    for(i=1;i<=n;i++) f>>a,update(i,a);

    for(i=1;i<=m;i++){
        f>>t;
        switch(t){
            case 0:
                f>>a>>b;
                update(a,b);
            break;
            case 1:
                f>>a>>b;
                g<<query1(b)-query1(a-1)<<"\n";
            break;
            default:
                f>>a;
                g<<query2(a)<<"\n";
        }
    }

    f.close();
    g.close();
    return 0;
}