第38次CSP认证第二题:机器人复健指南
80分题解:DFS
时间复杂度:\(O(8^k)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 110, MAX = 1e9, INF = -1e9;
int n,k;
int x,y;
int g[N][N];
int dx[8]={1,2,1,2,-1,-2,-1,-2};
int dy[8]={2,1,-2,-1,2,1,-2,-1};
int ans=0;
void dfs(int a,int b,int num){
g[a][b]=num;
if(num==0)return ;
for(int i=0;i<8;i++){
int x0=a+dx[i];
int y0=b+dy[i];
if(x0>=1&&x0<=n&&y0>=1&&y0<=n){
dfs(x0,y0,num-1);
}
}
return ;
}
void solve(){
cin>>n>>k>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=-1;
}
}
dfs(x,y,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]!=-1)ans++;
}
}
cout<<ans<<endl;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
100分题解:DFS+剪枝
时间复杂度:\(O(n^2 k)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 110, MAX = 1e9, INF = -1e9;
int n,k;
int x,y;
int g[N][N];
int dx[8]={1,2,1,2,-1,-2,-1,-2};
int dy[8]={2,1,-2,-1,2,1,-2,-1};
int ans=0;
void dfs(int a,int b,int num){
g[a][b]=num;
if(num==0)return ;
for(int i=0;i<8;i++){
int x0=a+dx[i];
int y0=b+dy[i];
if(x0>=1&&x0<=n&&y0>=1&&y0<=n&&g[x0][y0]<num-1){
dfs(x0,y0,num-1);
}
}
return ;
}
void solve(){
cin>>n>>k>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=-1;
}
}
dfs(x,y,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]!=-1)ans++;
}
}
cout<<ans<<endl;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第37次CSP认证第二题:机器人饲养指南
100分题解(1):完全背包(未优化)
时间复杂度:\(O(m^2 n)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 105, MAX = 1e9, INF = -1e12, M = 10005;
int n,m;
int w[N];
int dp[N][M];
void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>w[i];
}
memset(dp,0,sizeof dp);
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
for(int k=0;k*i<=j;k++){
dp[i][j]=max(dp[i][j],dp[i-1][j-k*i]+k*w[i]);
}
}
}
cout<<dp[m][n]<<endl;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
100分题解(2):完全背包(优化)
时间复杂度:\(O(mn)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 105, MAX = 1e9, INF = -1e12, M = 10005;
int n,m;
int w[N];
int dp[N][M];
void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>w[i];
}
memset(dp,0,sizeof dp);
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];
if(j>=i)dp[i][j]=max(dp[i][j],dp[i][j-i]+w[i]);
}
}
cout<<dp[m][n]<<endl;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第36次CSP认证第二题:梦境巡查
80分题解(1):二分答案
时间复杂度:\(O(n^2log(MAX))\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e5+10, MAX = 1e9, INF = -1e9;
int n;
int a[N];
int b[N];
bool check(int m,int p){
for(int i=1;i<=n;i++){
m-=a[i-1];
if(m<0)return false;
m+=(i==p ? 0 : b[i]);
}
return m>=a[n];
}
void solve(){
cin>>n;
for(int i=0;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++){
int l=0;int r=MAX;
while(l<r){
int mid=(l+r)>>1;
if(check(mid,i))r=mid;
else l=mid+1;
}
cout<<l<<" ";
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
80分题解(2):前缀和
时间复杂度:\(O(n^2)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e5+10, MAX = 1e8, INF = -1e9;
int n;
int a[N];
int b[N];
int suma=0;int sumb=0;
int key=0;
void solve(){
cin>>n;
for(int i=0;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
b[0]=0;
for(int i=1;i<=n;i++){
key=b[i];b[i]=0;
int suma=0;int sumb=0;
int ans=0;
for(int j=1;j<=n+1;j++){
suma+=a[j-1];sumb+=b[j-1];
ans=max(ans,suma-sumb);
}
b[i]=key;
cout<<ans<<" ";
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
100分题解:前缀和+后缀最大值
时间复杂度:\(O(n)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e5+10, MAX = 1e8, INF = -1e9;
int n;
int a[N];
int b[N];
int c[N];
int e=0;
int suma=0;int sumb=0;
void solve(){
cin>>n;
for(int i=0;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
b[0]=0;
for(int i=1;i<=n+1;i++){
suma+=a[i-1];sumb+=b[i-1];
c[i]=max(0ll,suma-sumb);
e=max(e,c[i]);
}
stack<int> ans;
for(int i=n+1;i>=1;i--){
c[i]=max(c[i+1],c[i]);
int x=max(e,c[i]+b[i-1]);
x=min(suma,x);
ans.push(x);
}
ans.pop();
while(!ans.empty()){
cout<<ans.top()<<" ";
ans.pop();
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第35次CSP认证第二题:字符串变换
80分题解:暴力哈希
时间复杂度:\(O(mnk)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
string s;
string t;
int n;
int q;
int e;
map<char,char> f;
void solve(){
getline(cin,s);
for(int i=0;i<=9;i++){
f['0'+i]=(char)('0'+i);
}
for(int i=0;i<=25;i++){
f['a'+i]=(char)('a'+i);
f['A'+i]=(char)('A'+i);
}
f['#']='#';f[' ']=' ';
cin>>n;
cin.ignore();
for(int i=1;i<=n;i++){
getline(cin,t);
f[t[1]]=t[2];
}
cin>>q;
cin.ignore();
while(q--){
cin>>e;
t=s;
for(int i=0;i<t.size();i++){
for(int j=1;j<=e;j++){
t[i]=f[t[i]];
}
}
cout<<t<<endl;
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
100分题解:循环
时间复杂度:\(O(mn)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
string s;
string t;
int n;
int q;
int e;
map<char,char> f;
map<char,vector<char>> mp;
void solve(){
getline(cin,s);
for(int i=0;i<=9;i++){
f['0'+i]=(char)('0'+i);
mp['0'+i].pb((char)('0'+i));
}
for(int i=0;i<=25;i++){
f['a'+i]=(char)('a'+i);
f['A'+i]=(char)('A'+i);
mp['a'+i].pb((char)('a'+i));
mp['A'+i].pb((char)('A'+i));
}
f['#']='#';f[' ']=' ';
mp['#'].pb('#');mp[' '].pb(' ');
cin>>n;
cin.ignore();
for(int i=1;i<=n;i++){
getline(cin,t);
f[t[1]]=t[2];
mp[t[1]].erase(mp[t[1]].begin());
mp[t[1]].pb(t[2]);
}
for(auto &i:mp){
char c=i.second[i.second.size()-1];
while(c!=i.first){
i.second.pb(f[c]);
c=f[c];
}
}
cin>>q;
cin.ignore();
while(q--){
cin>>e;
t=s;
for(int i=0;i<t.size();i++){
if(e%mp[t[i]].size()!=0)t[i]=mp[t[i]][e%mp[t[i]].size()-1];
}
cout<<t<<endl;
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第34次CSP认证第二题:矩阵重塑(其二)
100分题解:矩阵一维压缩
时间复杂度:\(O(t+mn)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e4+10, MAX = 1e8, INF = -1e9;
int a[N];
int g[N][N];
int m,n;
int q;
void f1(int x,int y){
n=x;
m=y;
}
void f2(){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
g[i][j]=a[(j-1)*m+i];
}
}
swap(m,n);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[(i-1)*m+j]=g[i][j];
}
}
}
void solve(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[(i-1)*m+j];
}
}
int op,x,y;
while(q--){
cin>>op>>x>>y;
if(op==1)f1(x,y);
else if(op==2)f2();
else cout<<a[x*m+y+1]<<endl;//二维数组的一维压缩
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第33次CSP认证第二题:相似度计算
100分题解:set
时间复杂度:\(O(nlogm)\) or \(O(mlogn)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,m;
string s;
set<string> sta;
set<string> stb;
void f(){
for(int i=0;i<s.size();i++){
s[i]=val(s[i]);
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s;
f();
sta.insert(s);
}
for(int i=1;i<=m;i++){
cin>>s;
f();
stb.insert(s);
}
int num=0;
for(auto i:sta){
if(stb.find(i)!=stb.end()){
num++;
}
}
cout<<num<<endl;
cout<<sta.size()+stb.size()-num<<endl;//容斥原理
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第32次CSP认证第二题:因子化简
100分题解:唯一分解定理,因子分解
时间复杂度:\(O(q\sqrt n)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e5+10, MAX = 1e8, INF = -1e9;
int q;
int n,k;
vector<PII> v;
void solve(){
cin>>q;
while(q--){
cin>>n>>k;
for(int i=2;i*i<=n;i++){
int num=0;
while(n%i==0){
num++;
n/=i;
}
v.pb({i,num});
}
if(n!=1)v.pb({n,1});
int ans=1;
for(auto i:v){
if(i.second>=k)ans*=pow(i.first,i.second);
}
cout<<ans<<endl;
v.clear();
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第31次CSP认证第二题:坐标变换(其二)
80分题解:暴力模拟
时间复杂度:\(O(mn)\)
C++版
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<int,double> PID;//修改定义
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,q;
int i,j;
PID a[N];
double x,y;
void solve(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i].first>>a[i].second;
}
while(q--){
cin>>i>>j>>x>>y;
for(int k=i;k<=j;k++){
if(a[k].first==1){
x*=a[k].second;
y*=a[k].second;
}
else{
double x0=x;
double y0=y;
x=x0*cos(a[k].second)-y0*sin(a[k].second);
y=x0*sin(a[k].second)+y0*cos(a[k].second);
}
}
cout<<fixed<<setprecision(3)<<x<<" "<<y<< endl;//C++精度输出方式
}
return ;
}
signed main()
{
fast();//开启
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
C语言版:
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<int,double> PID;//修改定义
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,q;
int i,j;
PID a[N];
double x,y;
void solve(){
cin>>n>>q;
for(int i=1;i<=n;i++){
scanf("%ld %lf",&a[i].first,&a[i].second);
}
while(q--){
scanf("%ld %ld %lf %lf",&i,&j,&x,&y);
for(int k=i;k<=j;k++){
if(a[k].first==1){
x*=a[k].second;
y*=a[k].second;
}
else{
double x0=x;
double y0=y;
x=x0*cos(a[k].second)-y0*sin(a[k].second);
y=x0*sin(a[k].second)+y0*cos(a[k].second);
}
}
printf("%.3lf %.3lf \n",x,y);//C语言版精度输出方式
}
return ;
}
signed main()
{
//fast();//关闭
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
100分题解:前缀和+前缀积
时间复杂度:\(O(m+n)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<int,char> PIC;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,q;
int i,j;
map<int,int> mpa;
map<int,int> mpb;
double x,y;
vector<double> na;
vector<double> nb;
void solve(){
cin>>n>>q;
na.pb(1.0);nb.pb(0.0);
for(int i=1;i<=n;i++){
cin>>j>>x;
if(j==1){
na.pb(na[na.size()-1]*x);
}
else{
nb.pb(nb[nb.size()-1]+x);
}
mpa[i]=na.size()-1;
mpb[i]=nb.size()-1;
}
while(q--){
cin>>i>>j>>x>>y;
double d=na[mpa[j]]/na[mpa[i-1]];
x*=d;
y*=d;
double x0=x;
double y0=y;
d=nb[mpb[j]]-nb[mpb[i-1]];
x=x0*cos(d)-y0*sin(d);
y=x0*sin(d)+y0*cos(d);
cout<<fixed<<setprecision(3)<<x<<" "<<y<< endl;
}
return ;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第29次CSP认证第二题:垦田计划
100分题解:二分答案
时间复杂度:\(O(nlog(MAX(t)))\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<PII> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e5+10, MAX = 1e9, INF = -1e12, M = 10005;
int n,m,k;
int t[N],c[N];
int maxs=-1;
int losts=MAX;
bool check(int mid){
int e=0;
for(int i=1;i<=n;i++){
if(t[i]>=mid)e+=(t[i]-mid)*c[i];
}
return e<=m;
}
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>t[i]>>c[i];
maxs=max(maxs,t[i]);
losts=min(losts,t[i]);
}
int l=k;int r=maxs;
while(l<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
第25次CSP认证第二题:出行计划
100分题解:差分
时间复杂度:\(O(n)\)
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<PII> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 1e6+10, MAX = 1e9, INF = -1e12, M = 10005;
int n,m,k;
int t,c;
int b[N];
int e;
void solve(){
cin>>n>>m>>k;
memset(b,0,sizeof b);
for(int i=1;i<=n;i++){
cin>>t>>c;
int l=max(1ll,t-c+1);
int r=t;
b[l]++;b[r+1]--;
}
for(int i=1;i<N;i++){
b[i]+=b[i-1];
}
while(m--){
cin>>e;
cout<<b[e+k]<<endl;
}
}
signed main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}