제출 #1321175

#제출 시각아이디문제언어결과실행 시간메모리
1321175SmuggingSpunAddk (eJOI21_addk)C++20
100 / 100
219 ms7012 KiB
#include<bits/stdc++.h>
#define taskname "A"
using namespace std;
typedef long long ll;
const int lim = 1e5 + 5;
int n, k, q;
ll f[lim];
namespace sub12{
	void solve(){
		f[0] = 0;
		for(int i = 1; i <= n; i++){
			cin >> f[i];
			f[i] += f[i - 1];
		}
		for(int i = 2; i <= n; i++){
			f[i] += f[i - 1];
		}
		function<ll(int, int)>get = [&] (int l, int r){
			return f[r] - f[max(0, l - 1)];
		};
		cin >> q;
		for(int _ = 0; _ < q; _++){
			int type;
			cin >> type;
			if(type == 1){
				cin >> type;
			}
			else{
				int l, r, m;
				cin >> l >> r >> m;
				cout << get(l + m - 1, r) - get(l - 1, r - m) << "\n";
			}
		}
	}
}
namespace sub3{
	int a[lim];
	ll st[lim << 2], lazy[lim << 2];
	void build(int id, int l, int r){
		lazy[id] = 0;
		if(l == r){
			st[id] = f[l];
			return;
		}
		int m = (l + r) >> 1;
		build(id << 1, l, m);
		build(id << 1 | 1, m + 1, r);
		st[id] = st[id << 1] + st[id << 1 | 1];
	}
	void push_down(int id, int l, int r, int m){
		st[id << 1] += lazy[id] * (m - l + 1);
		lazy[id << 1] += lazy[id];
		st[id << 1 | 1] += lazy[id] * (r - m);
		lazy[id << 1 | 1] += lazy[id];
		lazy[id] = 0;
	}
	void update(int id, int l, int r, int u, int v, int x){
		if(l > v || r < u){
			return;
		}
		if(u <= l && v >= r){
			st[id] += ll(x) * (r - l + 1);
			lazy[id] += x;
			return;
 		}
 		int m = (l + r) >> 1;
 		push_down(id, l, r, m);
 		update(id << 1, l, m, u, v, x);
 		update(id << 1 | 1, m + 1, r, u, v, x);
 		st[id] = st[id << 1] + st[id << 1 | 1];
	}
	ll get(int id, int l, int r, int u, int v){
		if(l > v || r < u){
			return 0;
		}
		if(u <= l && v >= r){
			return st[id];
		}
		int m = (l + r) >> 1;
		push_down(id, l, r, m);
		return get(id << 1, l, m, u, v) + get(id << 1 | 1, m + 1, r, u, v);
	}
	void solve(){
		f[0] = 0;
		for(int i = 1; i <= n; i++){
			cin >> a[i];
			f[i] = f[i - 1] + a[i];
		}
		build(1, 1, n);
		cin >> q;
		for(int _ = 0; _ < q; _++){
			int type;
			cin >> type;
			if(type == 1){
				vector<int>p(k);
				for(int& i : p){
					cin >> i;
				}
				p.push_back(p[0]);
				for(int i = 0; i < k; i++){
					update(1, 1, n, p[i], n, a[p[i + 1]] - a[p[i]]);
				}
				int x = a[p[0]];
				for(int i = 0; i < k; i++){
					a[p[i]] = a[p[i + 1]];
				}
				a[p[k - 1]] = x;
			}
			else{
				int l, r, m;
				cin >> l >> r >> m;
				cout << get(1, 1, n, l + m - 1, r) - get(1, 1, n, l - 1, r - m) << "\n";
			}
		}
	}
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	if(fopen(taskname".inp", "r")){
		freopen(taskname".inp", "r", stdin);
	}
	cin >> n >> k;
	if(k == 1){
		sub12::solve();
	}
	else{
		sub3::solve();
	}
}

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

Main.cpp: In function 'int main()':
Main.cpp:120:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...