結果

問題 No.877 Range ReLU Query
ユーザー mortal
提出日時 2021-08-03 03:07:17
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 97 ms / 2,000 ms
コード長 1,870 bytes
コンパイル時間 1,668 ms
コンパイル使用メモリ 170,708 KB
実行使用メモリ 11,264 KB
最終ジャッジ日時 2024-11-08 10:37:29
合計ジャッジ時間 4,192 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>

#define ll long long int
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()

#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
//note x>0
struct node
{
   ll val;
   int pos;
   int l;
   int r;
};
bool comp(node a,node b)
{
    if(a.val==b.val)
    {
        return a.l>b.l;
    }
    else
    {
        return a.val<b.val;
    }
}
const int N=100005;
ll bit[N];
int n;
void upd(int x,ll val){
   while(x<=n)
   {
      bit[x]+=val;
      x+=(x & (-x));
   }
}
ll pref(ll x)
{
   ll ans=0;
   while(x>0){
      ans=ans+bit[x];
      x-=(x & (-x));
   }
   return ans;
}
ll rsum(int l,int r)
{
   return pref(r)-pref(l-1);
}


ll bit1[N];

void upd1(int x,ll val){
   while(x<=n)
   {
      bit1[x]+=val;
      x+=(x & (-x));
   }
}
ll pref1(ll x)
{
   ll ans=0;
   while(x>0){
      ans=ans+bit1[x];
      x-=(x & (-x));
   }
   return ans;
}
ll rsum1(int l,int r)
{
   return pref1(r)-pref1(l-1);
}

  
int main()
{
   fast;
   int i,j,q;
   cin>>n>>q;
   node a[n+q];
   ll p[n+1]={0};
   for(i=0;i<n;i++)
   {
      ll x;
      cin>>x;
      p[i+1]=p[i]+x;
      a[i].val=x;
      a[i].pos=-1;
      a[i].l=0;
      a[i].r=i+1;

   }
   for(i=0;i<q;i++)
   {
      int t;
      cin>>t;
      ll l,r,x;
      cin>>l>>r>>x;
      a[i+n].val=x;
      a[i+n].pos=i;
      a[i+n].l=l;
      a[i+n].r=r;

   }
   sort(a,a+n+q,comp);
   ll ans[q];
   for(i=0;i<n+q;i++)
   {
      if(a[i].pos==-1)
      {
         upd(a[i].r,1);
         upd1(a[i].r,a[i].val);
      }
      else
      {
         
         ll x=a[i].r-a[i].l+1;
         x=x-rsum(a[i].l,a[i].r);
         
         ll y=p[a[i].r]-p[a[i].l-1];
         y=y-rsum1(a[i].l,a[i].r);
         

         ans[a[i].pos]=y-x*a[i].val;
      }
   }
   for(i=0;i<q;i++)
      cout<<ans[i]<<"\n";


   


   
   
}
0