답안 #1046532

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1046532 2024-08-06T16:16:36 Z MrPavlito Sterilizing Spray (JOI15_sterilizing) C++17
0 / 100
5000 ms 4232 KB
#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define sc second
#define endl "\n"
#define pii pair<int,int>

using namespace std;

const int MAXN = 1e5+5;
const int mod7 = 1e9+7;
const long long inf = 1e18;
int n,q,k;

vector<long long> seg(MAXN<<2);
vector<int> niz(MAXN);

void build(int nod, int l, int r)
{
    if(l==r)
    {
        seg[nod] = niz[l];
        return;
    }
    int mid = l+r >> 1;
    build(nod<<1, l, mid);
    build(nod<<1|1, mid+1, r);
    seg[nod] = seg[nod<<1] + seg[nod<<1|1];
}

void updatesingle(int nod, int l, int r,int index, int v)
{
    if(l == r)
    {
        seg[nod] = v;
        niz[index] = v;
        return;
    }
    int mid = l+r >> 1;
    if(index<=mid)updatesingle(nod<<1, l, mid, index, v);
    else updatesingle(nod<<1|1, mid+1, r, index, v);
    seg[nod] = seg[nod<<1] + seg[nod<<1|1];
}

void updaterange(int nod, int tl, int tr, int l, int r)
{
    if(tl> r || tr< l || tl>tr || seg[nod]==0)return;
    int mid = tl+tr>>1;
    if(tl>=l && tr<=r)
    {
        if(tl == tr)
        {
            seg[nod] /= k;
        }
        else if(seg[nod] > 0)
        {
            updaterange(nod<<1, tl, mid, l, r);
            updaterange(nod<<1|1, mid+1, tr, l, r);
            seg[nod] = seg[nod<<1] + seg[nod<<1|1];
        }
        return;
    }
    updaterange(nod<<1, tl, mid, l, r);
    updaterange(nod<<1|1, mid+1, tr, l, r);
    seg[nod] = seg[nod<<1] + seg[nod<<1|1];
}

int query(int nod, int tl, int tr, int l, int r)
{
    if(tl> r || tr< l || tl>tr || seg[nod]==0)return 0;
    if(tl>=l && tr<=r)return seg[nod];
    int mid = tl+tr >> 1;
    return query(nod<<1, tl, mid, l, r) + query(nod<<1|1, mid+1, tr, l, r);
}

signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0), cout.tie(0);
    int tt=1;
    //cin >> tt;
    while(tt--)
    {

        cin >> n >> q >> k;
        for(int i=1; i<=n; i++)cin >> niz[i];
        build(1,1,n);
        while(q--)
        {
            int a,b,c;
            cin >> a >> b >> c;
            if(a==1)updatesingle(1,1,n,b,c);
            else if(a==2)updaterange(1,1,n,b,c);
            else cout << query(1,1,n,b,c) << endl;
        }

    }
}

Compilation message

sterilizing.cpp: In function 'void build(int, int, int)':
sterilizing.cpp:28:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   28 |     int mid = l+r >> 1;
      |               ~^~
sterilizing.cpp: In function 'void updatesingle(int, int, int, int, int)':
sterilizing.cpp:42:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |     int mid = l+r >> 1;
      |               ~^~
sterilizing.cpp: In function 'void updaterange(int, int, int, int, int)':
sterilizing.cpp:51:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |     int mid = tl+tr>>1;
      |               ~~^~~
sterilizing.cpp: In function 'int query(int, int, int, int, int)':
sterilizing.cpp:75:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   75 |     int mid = tl+tr >> 1;
      |               ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3932 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2644 ms 4232 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 3932 KB Output is correct
2 Correct 6 ms 4000 KB Output is correct
3 Correct 9 ms 3972 KB Output is correct
4 Correct 23 ms 4032 KB Output is correct
5 Correct 29 ms 4000 KB Output is correct
6 Correct 29 ms 3932 KB Output is correct
7 Execution timed out 5067 ms 3980 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 41 ms 4188 KB Output isn't correct
2 Halted 0 ms 0 KB -