제출 #1117293

#제출 시각아이디문제언어결과실행 시간메모리
1117293Peter2017Sterilizing Spray (JOI15_sterilizing)C++14
75 / 100
530 ms98632 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pill pair<int,ll>
#define mem(a, b) memset(a, b, sizeof(a))
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define name "test"

using namespace std;

const int N = 1e5 + 5;
const int mod = 1e9 + 7;
const int MAX = 1e9;
const int LOG = 31 - __builtin_clz(MAX);

template <typename T1, typename T2> bool maxi(T1 &a, T2 b){if (a < b){a = b; return 1;} return 0;}
template <typename T1, typename T2> bool mini(T1 &a, T2 b){if (a > b){a = b; return 1;} return 0;}

int n;
int q;
int k;

struct SEGTREE
{
	struct Node{
		ll v[LOG + 1];
		Node(){mem(v, 0);}
		friend Node operator + (Node A, Node B){
			for (int j = 0; j <= LOG; j++)
				A.v[j] += B.v[j];
			return A;
		}
		Node update(int k){
			Node res;
			Node A = (*this);
			for (int j = 0; j <= LOG; j++){
				if (j + k > LOG) res.v[j] = 0;
				else res.v[j] = A.v[j + k];
			}
			return res;
		}
	};

	int lz[N << 2];
	Node val[N << 2];

	SEGTREE(){};

	void down(int id, int l, int r){
		if (!lz[id]) return;
		val[id] = val[id].update(lz[id]);
		if (l < r){
			lz[id << 1] += lz[id];
			lz[id << 1 | 1] += lz[id];
		}
		lz[id] = 0;
	}

	void updatePoint(int id, int l, int r, int i, int x){
		down(id, l, r);
		if (l > i || r < i) return;
		if (l == r){
			for (int j = 0; j <= LOG; j++){
				val[id].v[j] = x;
				x /= k;
			}
			return;
		}
		int m = (l + r) >> 1;
		updatePoint(id << 1, l, m, i, x);
		updatePoint(id << 1 | 1, m + 1, r, i, x);
		val[id] = val[id << 1] + val[id << 1 | 1];
	}


	void updateRange(int id, int l, int r, int u, int v){
		down(id, l, r);
		if (l > v || r < u) return;
		if (l >= u && r <= v){
			lz[id]++;
			down(id, l, r);
			return;
		}
		int m = (l + r) >> 1;
		updateRange(id << 1, l, m, u, v);
		updateRange(id << 1 | 1, m + 1, r, u, v);
		val[id] = val[id << 1] + val[id << 1 | 1];
	}

	ll get(int id, int l, int r, int u, int v){
		down(id, l, r);
		if (l > v || r < u) return 0;
		if (l >= u && r <= v) return val[id].v[0];
		int m = (l + r) >> 1;
		return get(id << 1, l, m, u, v) + get(id << 1 | 1, m + 1, r, u, v);
	}
} ST;

void load(){
    cin.tie(0)->sync_with_stdio(0);
    if (fopen(name".inp", "r")){
        freopen(name".inp", "r", stdin);
        freopen(name".out", "w", stdout);
    }
}

void input(){
	cin >> n >> q >> k;
	for (int i = 1; i <= n; i++){
		int x; cin >> x;
		ST.updatePoint(1, 1, n, i, x);
	}
}

void solve(){
	while (q--){
		int type, a, b; cin >> type >> a >> b;
		if (type == 1) ST.updatePoint(1, 1, n, a, b);
		if (type == 2) ST.updateRange(1, 1, n, a, b);
		if (type == 3) cout << ST.get(1, 1, n, a, b) << '\n';
	}
}

int main(){
    load();
    input();
    solve();
}

컴파일 시 표준 에러 (stderr) 메시지

sterilizing.cpp: In function 'void load()':
sterilizing.cpp:106:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...