Submission #25051

#TimeUsernameProblemLanguageResultExecution timeMemory
25051ziguiSterilizing Spray (JOI15_sterilizing)C++14
100 / 100
2073 ms8244 KiB
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<string.h>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<string>
#include<iostream>
#include<set>
#include<unordered_set>
#include<map>
#include<queue>
#include<functional>
#include<list>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double, double> pdd;
typedef tuple<int,int,int> t3;

const int MX = 1<<17;
const int MM = 1000000007;

struct Tree{
	pii t[MX*2];
	ll tot[MX*2];
	ll sum(int s, int e){
		s += MX, e += MX;
		ll r = 0;
		while( s <= e){
			if( s&1 ) r += tot[s++];
			if(~e&1 ) r += tot[e--];
			s /= 2, e /= 2;
		}
		return r;
	}
	pii read(int s, int e){
		s += MX, e += MX;
		pii mx = pii(0, -1);
		while( s <= e){
			if( s&1 ) mx = max(mx, t[s++]);
			if(~e&1 ) mx = max(mx, t[e--]);
			s /= 2, e /= 2;
		}
		return mx;
	}
	void update(int x, int v){
		x += MX; t[x] = pii(v, x-MX); tot[x] = v;
		while(x > 1){
			x /= 2; t[x] = max(t[x*2], t[x*2+1]);
			tot[x] = tot[x*2] + tot[x*2+1];
		}
	}
} tree;

int a, b, c, d;
int main()
{
	int N, Q, K;
	scanf("%d%d%d", &N, &Q, &K);
	for(int i = 1; i <= N; i++){
		scanf("%d", &a);
		tree.update(i, a);
	}
	for(int i = 1; i <= Q; i++){
		scanf("%d%d%d", &a, &b, &c);
		if( a == 1 ){
			tree.update(b, c);
		}
		else if( a == 2 ){
			if( K != 1 ){
				vector<pii> L;
				while(1){
					pii mx = tree.read(b, c);
					if( mx.first == 0 ) break;
					tree.update(mx.second, 0);
					L.emplace_back(mx.second, mx.first / K);
				}
				for(pii c : L) tree.update(c.first, c.second);
			}
		}
		else{
			printf("%lld\n", tree.sum(b, c));
		}
	}
}

Compilation message (stderr)

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:64:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d", &N, &Q, &K);
                             ^
sterilizing.cpp:66:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &a);
                  ^
sterilizing.cpp:70:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &a, &b, &c);
                              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...