Cod sursa(job #1418912)

Utilizator figure0907Andrei Gonczi figure0907 Data 14 aprilie 2015 13:13:39
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define maxn 15001
#define maxm 100001

struct trip
{
    int t;
    int x, y;
};

int n,m,i,p;
int a[maxn];
int v[2*maxn];
trip q[maxn];

void readdata()
{
    FILE *f = fopen("datorii.in","rt");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&q[i].t,&q[i].x,&q[i].y);
    }
    fclose(f);
}

int build_bin(int i)
{
    if (i>=p)
    {
        v[i]=a[i-p+1];
        return a[i-p+1];
    }
    v[i]=build_bin(2*i)+build_bin(2*i+1);
    return v[i];
}

int get_val(int x, int y)
{
    long long st=0,dr=0;
    int next;

    while (x>0)
    {
        next=x/2;
        if ((x%2)==1)
        {
            st+=v[x-1];
        }
        x=next;
    }

    while (y>0)
    {
        next=y/2;
        if ((y%2)==0)
        {
            dr+=v[y+1];
        }
        y=next;
    }

    return v[1]-st-dr;
}

void mod_val(int x, int y)
{
    while (x>0)
    {
        v[x]-=y;
        x/=2;
    }
}

int solve()
{
    p=1;
    while (p<n) p*=2;
    build_bin(1);
    return 0;
}

void writedata()
{
    FILE *f = fopen("datorii.out","wt");
    for (i=1;i<=m;i++)
    {
        if (q[i].t)
        {
            fprintf(f,"%d\n",get_val(q[i].x+p-1,q[i].y+p-1));
        }
        else
        {
            mod_val(q[i].x+p-1,q[i].y);
        }
    }
    fprintf(f,"\n");
    fclose(f);
}

int main()
{
    readdata();
    solve();
    writedata();

    return 0;
}