Cod sursa(job #1563362)

Utilizator Andrei143Andrei Andrei Andrei143 Data 5 ianuarie 2016 22:32:23
Problema Cuburi2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<iostream>
#include<fstream>
using namespace std;
long long v[250002],n;
long long s1[250002],s2[250002];
char *now,buffer[100000];
ifstream f("cuburi2.in");
inline void bfill()
{
    if (*now==0)
    {
        f.get(buffer,100000,'\0');
        now=buffer;
    }
}
int read()
{
    int x=0;
    while (*now<'0'||*now>'9')
    {
        now++;
        bfill();
    }
    while (*now>='0'&&*now<='9')
    {
        x=10*x+*now-'0';
        now++;
        bfill();
    }
    return x;
}
int main()
{
    ofstream g("cuburi2.out");
    int m,q,w;
    f>>n>>m;
    now=buffer;
    bfill();
    for (int i=1;i<=n;i++)
    {v[i]=read();
    v[i]+=v[i-1];
    s1[i]=v[i]+s1[i-1];}
    for (int i=n;i>0;i--)
        s2[i]=s2[i+1]+v[n]-v[i-1];
    while (m--)
    {
        int q,w;
        q=read();
        w=read();
        int poz=q,d;
        for (d=1;d<=w-q+1;d<<=1);
        for (;d;d>>=1)
        if ((poz+d<=w)&&(v[poz+d-1]-v[q-1]<v[w]-v[poz+d-1]))
            poz+=d;
        long long st,dr;
        st=s1[poz-1]-s1[q-1]-(poz-q)*v[q-1];
        dr=s2[poz+1]-s2[w+1]-(w-poz)*(v[n]-v[w]);
        g<<poz<<" "<<st+dr<<'\n';
    }
    return 0;
}