Cod sursa(job #854235)

Utilizator cdascaluDascalu Cristian cdascalu Data 12 ianuarie 2013 23:18:57
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#define Nmax 15001
using namespace std;

int N,M,vec[Nmax],rad,part[Nmax];
FILE*f = fopen("datorii.in","r");
FILE*g = fopen("datorii.out","w");
void read_data()
{
    fscanf(f,"%d%d",&N,&M);
    int i;
    for(i=1;i<=N;++i)
        fscanf(f,"%d",&vec[i]);
}
int minim(int a,int b)
{
    if(a<=b)
        return a;
    return b;
}
int maxim(int a,int b)
{
    if(a>=b)
        return a;
    return b;
}
int query(int x,int y)
{
    int sum,left,right,st,dr,cnt,j;
    for(left=1, right = left+rad-1,cnt=1,sum=0;left <= N;left=right+1,right += rad,++cnt)
    {
        st = maxim(left, x);
        dr = minim(right, y);
        dr = minim(dr, N);
        if(st == left && dr == right)//..X...left...right...Y....
            sum += part[cnt];
        else
        {
            for(j=st;j<=dr;++j)
                sum += vec[j];
        }
    }
    return sum;
}
void update(int poz,int val)
{
    vec[poz] -= val;
    int left,right,ok=0,cnt;
    for(left=1, right = left+rad-1, cnt=1;left<=N && !ok;left=right+1,right+=rad, ++cnt)
        if(left<=poz && poz<=right)
        {
            part[cnt] -= val;
            ok = 1;
        }
    return;
}
void get_it()
{
    for(rad=1;rad*rad<=N;++rad);
    --rad;
    int i,j;
    for(i=1,j=1;i<=N;++i)//pun sumele pe bucati(prima bucata a doua etc);
    {
        part[j] += vec[i];
        if(j*rad == i)
            ++j;
    }
}
int main()
{
    read_data();
    get_it();
    int op,x,y;
    while(M--)
    {
        fscanf(f,"%d%d%d",&op,&x,&y);
        if(op)
            fprintf(g,"%d\n", query(x,y));
        else
            update(x,y);
    }
    fclose(f);
    fclose(g);

    return 0;
}