結果

問題 No.1290 Addition and Subtraction Operation
ユーザー kotatsugame
提出日時 2020-11-13 22:55:04
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 181 ms / 2,000 ms
コード長 2,248 bytes
コンパイル時間 1,092 ms
コンパイル使用メモリ 90,448 KB
実行使用メモリ 14,592 KB
最終ジャッジ日時 2024-07-22 21:54:30
合計ジャッジ時間 6,798 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 85
権限があれば一括ダウンロードができます
コンパイルメッセージ
a.cpp:10:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]

ソースコード

diff #

#line 1 "a.cpp"
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#line 2 "/home/kotatsugame/library/datastructure/dualsegtree.cpp"
#include<functional>
template<typename T>
struct dualsegtree{
	using F=function<T(T,T)>;
	const F lazycalcfn,updatefn;
	int n;
	T lazydefvalue;
	vector<T>dat,lazy;
	vector<bool>lazyflag;
	dualsegtree(int n_=0,T defvalue=0,
		const F lazycalcfn_=[](T a,T b){return a+b;},
		const F updatefn_=[](T a,T b){return a+b;},
		T lazydefvalue_=0
	):lazydefvalue(lazydefvalue_),
		lazycalcfn(lazycalcfn_),updatefn(updatefn_)
	{
		n=1;
		while(n<n_)n<<=1;
		dat.assign(n,defvalue);
		lazy.assign(n-1,lazydefvalue);
		lazyflag.assign(n-1,false);
	}
	void copy(const vector<T>&v)
	{
		for(int i=0;i<v.size();i++)dat[i]=v[i];
		lazy.assign(n-1,lazydefvalue);
		lazyflag.assign(n-1,false);
	}
	void update(int a,int b,T x,int k=0,int l=0,int r=-1)//[a,b)
	{
		if(r<0)r=n;
		if(b<=l||r<=a)return;
		else if(a<=l&&r<=b)
		{
			if(k<n-1)
			{
				lazy[k]=lazycalcfn(lazy[k],x);
				lazyflag[k]=true;
			}
			else dat[k-n+1]=updatefn(dat[k-n+1],x);
		}
		else
		{
			if(lazyflag[k])
			{
				update(0,n,lazy[k],k*2+1,l,(l+r)/2);
				update(0,n,lazy[k],k*2+2,(l+r)/2,r);
				lazy[k]=lazydefvalue;
				lazyflag[k]=false;
			}
			update(a,b,x,k*2+1,l,(l+r)/2);
			update(a,b,x,k*2+2,(l+r)/2,r);
		}
	}
	T query(int i)
	{
		T ret=dat[i];
		i+=n-1;
		while(i>0)
		{
			i=(i-1)/2;
			if(lazyflag[i])ret=updatefn(ret,lazy[i]);
		}
		return ret;
	}
};
#line 6 "a.cpp"
int N,M;
long B[1<<17];
vector<int>E[1<<17];
int R[1<<17];
main()
{
	cin>>N>>M;
	for(int i=0;i<N;i++)
	{
		cin>>B[i];
		if(i%2)B[i]=-B[i];
		R[i]=-1;
	}
	for(int i=0;i<M;i++)
	{
		int L,R;cin>>L>>R;
		L--;
		E[L].push_back(R);
	}
	for(int i=0;i<N;i++)if(!E[i].empty())
	{
		sort(E[i].begin(),E[i].end());
		R[i]=E[i][0];
		for(int j=1;j<E[i].size();j++)
		{
			int l=E[i][j-1],r=E[i][j];
			if(l<r)
			{
				E[l].push_back(r);
			}
		}
	}
	dualsegtree<long>P(N,0,[](long a,long b){return a+b;},[](long a,long b){return a+b;});
	P.copy(vector<long>(B,B+N));
	for(int i=0;i<N;i++)
	{
		long T=P.query(i);
		if(R[i]==-1)
		{
			if(T!=0)
			{
				cout<<"NO"<<endl;
				return 0;
			}
		}
		else
		{
			P.update(i,R[i],-T);
		}
	}
	cout<<"YES"<<endl;
}
0