#include using namespace std; const double Pi = acos(-1.0); struct cplex { double r,i; cplex(double _r = 0.0 , double _i = 0.0) { r = _r , i = _i; } cplex operator+(const cplex &b) { return cplex(r+b.r,i+b.i); } cplex operator-(const cplex &b) { return cplex(r-b.r,i-b.i); } cplex operator * (const cplex &b) { return cplex(r*b.r-i*b.i,r*b.i+i*b.r); } }; void change(vector &y) { int ln=y.size(); for(int i=1,j=ln>>1; i>1; while(j>=k) { j-=k; k>>=1; } j+=k; } } void fft(vector &y,int on) { change(y); int len=y.size(); for(int m=2; m<=len; m<<=1) { cplex wm(cos(-on*2*Pi/m),sin(-on*2*Pi/m)); for(int k=0; k mult(vector a,vector b) { int len=1; int la=a.size(); int lb=b.size(); while(len x1(len); vector x2(len); for(int i=0; i sol(len); for(int i=0; i results[MX/SQ]; void solve(){ scanf("%d %d",&n,&QN); assert(1 <= n && n <= 100000); for(int j = 1 ; j <= n ; j++) scanf("%d",&A[j]); for(int j = 1 ; j <= n ; j++) scanf("%d",&B[j]); vector < ll > values; for(int j = 1 ; j <= n ; j++) values.push_back(A[j]); for(int a = 1 ; a <= n ; a+=SQ){ int idx = a / SQ; int b = a + SQ - 1; b = min(b , n); vector < ll > v; for(int j = a ; j <= b ; j++) v.push_back(B[j]); reverse(v.begin() , v.end()); results[idx] = mult(values , v); } while(QN--){ int l1 , l2 , r1 , r2 , len; scanf("%d %d %d",&l1,&l2,&len); r1 = l1 + len - 1; r2 = l2 + len - 1; ll ans = 0; for(int a = ( (l2 - 1) / SQ )*SQ + 1 ; a <= r2 ; a += SQ){ int idx = a / SQ; int b = a + SQ - 1; b = min(b , n); if(l2 > b || r2 < a) continue; //cout<= l2 && b <= r2){ int upstart = l1 + a - l2; int inmulindex = min(SQ , n - a + 1); int sumindex = upstart - 1 + inmulindex - 1; ans += results[idx][sumindex]; } else{ int stindex = max(l2 , a) , enindex = min(r2 , b); for(int j = stindex ; j <= enindex ; j++){ ans += 1ll * B[j] * A[l1 + j - l2]; } } //cout<