Cod sursa(job #1875214)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 10 februarie 2017 20:46:50
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;
int aint[400005],a[100005],n,q,sum,i,cod,x,y;
void build(int nod, int st, int dr)
{
    int mij;
    if(st==dr)
    {
        aint[nod]=a[st];
        return;
    }
    mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
    aint[nod]=aint[nod*2]+aint[nod*2+1];
}
void update(int nod, int st, int dr, int poz, int val)
{
    int mij;
    if(st==dr)
    {
        aint[nod]+=val;
        return;
    }
    mij=(st+dr)/2;
    if(poz<=mij)update(nod*2,st,mij,poz,val);
    else update(nod*2+1,mij+1,dr,poz,val);
    aint[nod]=aint[nod*2]+aint[nod*2+1];
}
void query(int nod, int st, int dr, int x, int y)
{
    int mij;
    if(x<=st&&y>=dr)
    {
        sum=sum+aint[nod];
        return;
    }
    mij=(st+dr)/2;
    if(x<=mij)query(nod*2,st,mij,x,y);
    if(y>=mij+1)query(nod*2+1,mij+1,dr,x,y);
}
void pozitie(int nod, int st, int dr, int suma)
{
    int mij;
    if(aint[nod]==suma)
    {
        sum=dr;
        return;
    }
    mij=(st+dr)/2;
    if(aint[nod*2]>=suma)pozitie(nod*2,st,mij,suma);
    else pozitie(nod*2+1,mij+1,dr,suma-aint[nod*2]);
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    while(q)
    {
        q--;
        scanf("%d",&cod);
        if(cod==0)
        {
            scanf("%d%d",&x,&y);
            update(1,1,n,x,y);
        }
        if(cod==1)
        {
            scanf("%d%d",&x,&y);
            sum=0;
            query(1,1,n,x,y);
            printf("%d\n",sum);
        }
        if(cod==2)
        {
            sum=0;
            scanf("%d",&x);
            pozitie(1,1,n,x);
            if(sum==0)sum=-1;
            printf("%d\n",sum);
        }
    }
    return 0;
}