Cod sursa(job #1178982)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 27 aprilie 2014 17:33:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<cstdio>
const int N=15000;
int tree[N*2+1];
int v[N+1];
int n,nrQ,poz,val,l,r;
bool qType;
void changeValTree(int l,int r,int pozTree){
    int m=(l+r)/2;
    tree[pozTree]+=val-v[poz];
    if(l==r)
        return;
    if(poz<=m)
        changeValTree(l,m,pozTree*2);
    else
        changeValTree(m+1,r,pozTree*2+1);
}
void changeV(){
    changeValTree(1,n,1);
}
int getCase(int left,int right,int l,int r){
    int m=(left+right)/2;
    if(l==left&&r==right)
        return 1;
    if(l>m)
        return 4;
    if(r<=m)
        return 3;
    return 2;
}
int sumTree(int left,int right,int pozTree,int l,int r){
    int m=(left+right)/2,treeCase=getCase(left,right,l,r);
    if(treeCase==1)
        return tree[pozTree];
    else if(treeCase==2)
        return sumTree(left,m,pozTree*2,l,m)+sumTree(m+1,right,pozTree*2+1,m+1,r);
    else if(treeCase==3)
        return sumTree(left,m,pozTree*2,l,m);
    else
        return sumTree(m+1,right,pozTree*2+1,m+1,r);
}
int sum(){
    return sumTree(1,n,1,l,r);
}
void scan(){
    int i;
    scanf("%d%d",&n,&nrQ);
    for(i=1;i<=n;i++){
        scanf("%d",&val);
        poz=i;
        changeV();
        v[i]=val;
    }
}
void init(){
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scan();
}
void scanQ(){
    int scan;
    scanf("%d",&scan);
    qType=scan==1;
    if(qType)
        scanf("%d%d",&l,&r);
    else
        scanf("%d%d",&poz,&val);
}
int main(){
    init();
    while(nrQ!=0){
        scanQ();
        val=v[poz]-val;
        if(qType)
            printf("%d\n",sum());
        else
            changeV();
        nrQ--;
    }
    return 0;
}