Cod sursa(job #1895307)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 27 februarie 2017 21:37:16
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
using namespace std;
long long stm[250002],stM[250002],drm[250002],drM[250002],st,dr;
int v[250002],n,m,x,y,poz;
void caut(int a,int b) //cautare binara
{
    int m;
    while(a<=b)
    {
        m=(a+b)>>1;
        if(stm[m-1]-stm[x-1]<stm[y]-stm[m-1]) //daca avem mai putin in stanga cantitativ
        {
            a=m+1;
            poz=m;
        }
        else b=m-1;
    }
}
int main()
{
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&v[i]);
        stm[i]=stm[i-1]+v[i];
        stM[i]=stM[i-1]+stm[i-1]; //toate sec pt mutari pana la i de la st la dr
    }
    for(i=n;i>=1;--i)
    {
        drm[i]=drm[i+1]+v[i];
        drM[i]=drM[i+1]+drm[i+1]; //toate sec pt mutari pana la i de la dr la st
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        poz=x;
        caut(x,y);
        st=stM[poz]-stM[x-1]-stm[x-1]*(poz-x+1);
        dr=drM[poz]-drM[y+1]-drm[y+1]*(y-poz+1);
        long long p=st+dr;
        printf("%d %lld\n",poz,p);
    }
return 0;}