結果
| 問題 |
No.877 Range ReLU Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-08-03 03:09:54 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 100 ms / 2,000 ms |
| コード長 | 1,781 bytes |
| コンパイル時間 | 1,893 ms |
| コンパイル使用メモリ | 170,512 KB |
| 実行使用メモリ | 10,496 KB |
| 最終ジャッジ日時 | 2024-11-08 10:37:51 |
| 合計ジャッジ時間 | 4,720 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
#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];
for(i=0;i<n;i++)
{
ll x;
cin>>x;
upd(i+1,1);
upd1(i+1,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
{
ans[a[i].pos]=rsum1(a[i].l,a[i].r)-a[i].val*rsum(a[i].l,a[i].r);
}
}
for(i=0;i<q;i++)
cout<<ans[i]<<"\n";
}