結果
| 問題 | No.631 Noelちゃんと電車旅行 | 
| コンテスト | |
| ユーザー |  Kutimoti_T | 
| 提出日時 | 2018-01-06 20:53:46 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 368 ms / 2,000 ms | 
| コード長 | 1,846 bytes | 
| コンパイル時間 | 1,075 ms | 
| コンパイル使用メモリ | 66,196 KB | 
| 実行使用メモリ | 9,728 KB | 
| 最終ジャッジ日時 | 2024-10-02 09:32:13 | 
| 合計ジャッジ時間 | 7,112 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
struct LazySegment{
	
	int n;
	vector<ll> node,lazy;
	LazySegment(vector<ll>& v)
	{
		int sz = (int)v.size();
		n = 1;
		while(n < sz) n*= 2;
		node.resize(2 * n - 1);
		lazy.resize(2 * n - 1,0);
		for(int i = 0;i < sz;i++) node[i + n - 1] = v[i] + (sz - i) * 3;
		for(int i = n - 2;i >=0;i--) node[i] = max(node[i * 2 + 1],node[i * 2 + 2]);
	}	
	void eval(int k,int l,int r)
	{
		if(lazy[k] != 0)
		{
			node[k] += lazy[k];
			if(r - l > 1)
			{
				lazy[2 * k + 1] += lazy[k];
				lazy[2 * k + 2] += lazy[k];
			}
			lazy[k] = 0;
		}
	}
	void add(int a,int b,ll x,int k = 0,int l = 0,int r = -1)
	{
		if(r < 0) r = n;
		eval(k,l,r);
		if(r <= a || b <= l) return;
		if(a <= l && r <= b)
		{
			lazy[k] += x;
			eval(k,l,r);
		}
		else
		{
			add(a,b,x,2 * k + 1,l,(l + r) / 2);
			add(a,b,x,2 * k + 2,(l + r) / 2,r);
			node[k] = max(node[2 * k + 1] , node[2 * k + 2]);
		}
	}
	
	ll getMax(int a,int b,int k = 0,int l = 0,int r = -1)
	{
		if(r < 0) r = n;
		eval(k,l,r);
		if(r <= a || b <= l) return -100000000;
		if(a <= l && r <= b) return node[k];
		ll vl = getMax(a,b,2*k+1,l,(l + r)/2);
		ll vr = getMax(a,b,2*k+2,(l + r)/2,r);
		return max(vl,vr);
	}
	void Print()
	{
		cout << endl;
		ll cou = 1;
		for(int i = 0;i < node.size();i++)
		{
			if(i == cou)
			{
				cout << endl;
				cou = 2 * cou + 1;
			}
			cout << node[i] << "+" << lazy[i] << " ";
		}
	}
};
int N;
vector<ll> T;
int M;
int L[100001];
int R[100001];
ll D[100001];
int main()
{
	cin >> N;
	T.resize(N - 1);
	for(int i = 0;i < N - 1;i++)
	{
		cin >> T[i];
	}
	cin >> M;
	for(int i = 0;i < M;i++)
	{
		cin >> L[i] >> R[i] >> D[i];
	}
	LazySegment seg(T);
	for(int i = 0;i < M;i++)
	{
		seg.add(L[i] - 1,R[i],D[i]);
		cout << seg.getMax(0,N) << endl;
	}
	return 0;
}
            
            
            
        