Monday, June 12, 2017

Codechef June Long - SUMQ

https://www.codechef.com/problems/SUMQ

// aarifshuvo   ``CSEJU

#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define SZ(x) ((int)(x).size())
#define scl(x) scanf("%lld", &x)
#define scll(x,y) scanf("%lld %lld", &x, &y)
#define all(x) (x).begin(),(x).end()
#define mem(a,d) memset(a,d,sizeof a)
#define REP(i,n) for(int i=0;i<n;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define pri(a) cout<<a<<endl
#define prii(a,b) cout<<a<<" "<<b<<endl
using namespace std;

#define inf 12345678912
#define sz 100007
#define mod 1000000007

ll arx[sz];
ll cmx[sz];

ll ary[sz];

ll arz[sz];
ll cmz[sz];


ll bsrch(ll ar[], ll val, ll lo, ll hi)
{
    ll ans = 0;
    while(lo<=hi)
    {
        ll md = (lo+hi)/2;

        if(ar[md]<=val) ans = md, lo = md+1;
        else hi = md-1;
    }
    return ans;
}

int main()
{
    ll t,s,x,y,z;
    scl(t);
    while(t--)
    {
        ll smx = 0, smz = 0;

        scll(x,y);
        scl(z);

        cmx[0] = 0;
        FOR(i,1,x) scl(arx[i]);
        sort(arx+1,arx+x+1);
        FOR(i,1,x) cmx[i] = (cmx[i-1] + arx[i])%mod;

        FOR(i,1,y) scl(ary[i]);

        cmz[0] = 0;
        FOR(i,1,z) scl(arz[i]);
        sort(arz+1,arz+z+1);
        FOR(i,1,z) cmz[i] = (cmz[i-1] + arz[i])%mod;

        ll idx,idz,tmp, res = 0;

        FOR(i,1,y)
        {
            tmp = ary[i];

            //arx e tmp er che choto kon idx prjnto ase

            idx = upper_bound(arx+1,arx+x+1,tmp) - arx;
            idz = upper_bound(arz+1,arz+z+1,tmp) - arz;

            idx--; idz--;   // becoz right most index of tmp<=arx[i]

//            idx = bsrch(arx, tmp, 1, x);
//            idz = bsrch(arz, tmp, 1 , z);

            smx = cmx[idx];
            smz = cmz[idz];

            res = ( res + ( (idx*tmp)%mod + smx)%mod * ( (idz*tmp)%mod + smz)%mod ) % mod;
        }
        pri(res);
    }
    return 0;
}

No comments:

Post a Comment